blob: 2eb419efc0b5580cf2aaaae33ba0341194d02ddb [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>CDI Dynamic Inject</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>: jbake-type: page
: jbake-status: published</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Sometimes we need to write multiple implementations for a business rules interface, to increase decoupling we will dynamically inject the implementation at runtime.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_example_1">Example 1</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this example we have a <code>Payment</code> interface and its implementations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Cash</p>
</li>
<li>
<p>CreditCard</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In our test (<code>FinalizePaymentTest</code>) we injected the FinalizePayment class, and called the <code>finishWithCash</code> method.</p>
</div>
<div class="paragraph">
<p>This method will dynamically inject the correct implementation using CDI features.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public String finishWithCash () {
paymentChoosed = paymentsLazy.select(Cash.class).get ();
return paymentChoosed.pay ();
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>note that a variable called <code>paymentsLazy</code> is variable will contain all implementations of the <code>Payment</code> interface</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Inject
@Any
private Instance &lt;Payment&gt; paymentsLazy;</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this variable we are using:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Annotation <code>@inject</code></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Indicates to CDI that we need a dependency injection</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Annotation <code>@Any</code></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Indicate that all possible implementations should be listed.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>Instance</code> object</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Object responsible for knowing all possible implementations and instantiating them at the desired time.</p>
</div>
<div class="paragraph">
<p>With this variable ready we can call it using:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">paymentsLazy.select(Cash.class).get ();</code></pre>
</div>
</div>
<div class="paragraph">
<p>where <code>Cash.class</code> tells you the implementation and <code>.get()</code> returns the ready-to-use instance.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_example_2">Example 2</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this example we have a <code>Payment</code> interface and its implementations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Cash</p>
</li>
<li>
<p>CreditCard</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In our test (<code>FinalizePaymentQualifierTest</code>) we injected the FinalizePayment class, and called the <code>finishByQualifier</code> method.</p>
</div>
<div class="paragraph">
<p>This method will dynamically inject the correct implementation using a <code>Qualifier</code> (PaymentType).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public String finishByQualifier (PaymentType type) {
paymentChoosed = paymentsLazy.select (new PayByQualifier (type)) .get ();
return paymentChoosed.pay ();
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>For this approach to work we will need to create a new class called <code>PayByQualifier</code> that extends <code>AnnotationLiteral</code> that expects a qualifier to pass into its <code>T extends Annotation</code> (Generics) parameter.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public class PayByQualifier extends AnnotationLiteral &lt;PaymentQualifier&gt; implements PaymentQualifier {
private PaymentType type;
public PayByQualifier (PaymentType type) {
this.type = type;
}
@Override
public PaymentType type () {
return this.type;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>the important thing is to implement the Annotation method in our case the <code>public PaymentType type();</code></p>
</div>
<div class="paragraph">
<p>To facilitate this implementation we receive this value from constructor class.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public PayByQualifier (PaymentType type) {
this.type = type;
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>With this class ready we can use it in our business class:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">paymentChoosed = paymentsLazy.select (new PayByQualifier(type)).get ();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Obs: The qualifier structure was reused from <a href="https://github.com/cassunde/tomee/tree/master/examples/cdi-qualifier" class="bare">https://github.com/cassunde/tomee/tree/master/examples/cdi-qualifier</a> project</p>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>