<div dir="ltr">Technically speaking, I can have a bean like this:<div><br></div><div>@ApplicationScoped</div><div>public class Foo {</div><div>    public void onStart(@Observes @initialized(ApplicationScoped.class) Object obj) {</div><div>       // do some work here</div><div>    }</div><div>}</div><div><br></div><div>That bean will get instantiated by the container, even if it doesn&#39;t have any injection targets.</div><div><br></div><div>John</div><div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 24, 2015 at 7:18 PM arjan tijms &lt;<a href="mailto:arjan.tijms@gmail.com">arjan.tijms@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
On Mon, Aug 24, 2015 at 9:47 PM, Nigel Deakin &lt;<a href="mailto:nigel.deakin@oracle.com" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=nigel.deakin@oracle.com&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">nigel.deakin@oracle.com</a>&gt; wrote:<br>
&gt; As I understand it, if you want to create a CDI managed bean (so that it is<br>
&gt; managed by CDI) then you have to inject it into some code somewhere.<br>
<br>
This is not exclusively the case really;<br>
<br>
There are generally 3 options:<br>
<br>
1. Bean is injected<br>
2. Bean is named (using @Named annotation or getName() of a Bean&lt;T&gt;<br>
returns non null) and referenced by EL<br>
3. Bean is programmatically created via BeanManager<br>
<br>
In saw that the proposal essentially has an example of 3. already;<br>
using the Instance injection. There are 2 variants on this where code<br>
either uses the BeanManager directly or uses the &quot;shortcut&quot;<br>
CDI.current().select(...);<br>
<br>
Option 3. is often used when something needs a bean of a specific type<br>
to do something. E.g. in JSF 2.3 a user would define a bean like this:<br>
<br>
@FacesDataModel(forClass = MyCollection.class)<br>
public class MyCollectionModel&lt;E&gt; extends DataModel&lt;E&gt; { ... }<br>
<br>
And it just sits there (the user doesn&#39;t have to create it).<br>
<br>
When a component needs this, it tries to obtain it programmatically,<br>
via something like:<br>
<br>
cdi.select(<br>
    DataModel.class,<br>
    new FacesDataModelAnnotationLiteral(MyCollection.class)<br>
).get();<br>
<br>
So the *expectation* may be that a user just defines a CDI based JMS<br>
listener bean, and that the container will then find those beans when<br>
it needs to deliver a message.<br>
<br>
Of course this is not entirely trivial in the JMS listener case. The<br>
JMS runtime can not easily ask CDI for all active instances of say the<br>
request scope, and then ask for beans to be created in all those<br>
scopes and then deliver the message to all of them.<br>
<br>
<br>
&gt; If I understand things correctly, if this is a normal CDI bean then this<br>
&gt; alone is not sufficient to cause an instance of the bean to be created.<br>
&gt;<br>
&gt; You also need to<br>
&gt; (1) inject it into some other bean<br>
&gt; (2) create that other bean and<br>
&gt; (3) call a method on the MyListenerBean to trigger lazy initialisation.<br>
<br>
This is one way for sure, but one alternative worth mentioning is to<br>
eagerly instantiatie the scoped bean whenever its scope starts. For<br>
OmniFaces we have implemented a separate annotation for this for CDI<br>
1.0, see <a href="http://showcase.omnifaces.org/cdi/Eager" rel="noreferrer" target="_blank">http://showcase.omnifaces.org/cdi/Eager</a><br>
<br>
For CDI 1.1, there&#39;s the @Initialized and @Destroyed annotations that<br>
can be used to observe any scope where the implementing Context throws<br>
events for these (which are all Java EE provided scopes as far as I<br>
know). See <a href="https://rmannibucau.wordpress.com/2015/03/10/cdi-and-startup" rel="noreferrer" target="_blank">https://rmannibucau.wordpress.com/2015/03/10/cdi-and-startup</a><br>
and <a href="https://issues.jboss.org/browse/CDI-86" rel="noreferrer" target="_blank">https://issues.jboss.org/browse/CDI-86</a><br>
<br>
One CDI technicality is that if the listener method is called via the<br>
proxy, I think it will resolve to the current scope that thread is in.<br>
So this may mean the JMS endpoint that calls the JMS listener bean can<br>
only call the actual bean&#39;s method, not the proxied one. I&#39;m sure the<br>
CDI experts here will have more knowledge about this.<br>
<br>
Hope this helps.<br>
<br>
Kind regards,<br>
Arjan Tijms<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
&gt;<br>
&gt; I&#39;m trying to avoid getting ahead of myself here. My current proposals<br>
&gt; simply apply to normal CDI managed beans created in the normal way (via<br>
&gt; injection and lazy initialisation). But I could certainly see a benefit in<br>
&gt; extending this to allow JMS listener beans to be created in other ways. In<br>
&gt; particular:<br>
&gt;<br>
&gt; (a) Creating the bean instance as soon as the bean into which it is injected<br>
&gt; enters a new scope rather than waiting for the application to call a method<br>
&gt; on it (so-called eager initialisation). That sounds relatively<br>
&gt; straightforward to me; this could either be a new standard CDI feature<br>
&gt; available to all normal-scoped beans, or something specific to beans<br>
&gt; annotated with @JMSListener.<br>
&gt;<br>
&gt; (b) Creating the bean instance without the need to inject it anywhere.  As<br>
&gt; you suggest, in the case of ApplicationScoped beans this would make JMS<br>
&gt; listener beans more like MDBs. But it might be equally useful to support<br>
&gt; this for other normal scopes. For example, could we annotate a<br>
&gt; @RequestScoped bean so that every time a new request scope started, an<br>
&gt; instance of the bean for that scope was automatically created?<br>
&gt;<br>
&gt; Or if we manage to get the @Startup annotation to Commons Annotation :<br>
&gt;<br>
&gt; @Startup<br>
&gt; public class MyListenerBean{<br>
&gt;<br>
&gt;<br>
&gt; @JMSListener(lookup=&quot;java:global/java:global/Trades&quot;,type=JMSListener.Type.TOPIC<br>
&gt; )<br>
&gt;    public void deliver(Message message) {<br>
&gt;      ...<br>
&gt;    }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; That looks as if it&#39;s tied to ApplicationScoped. I&#39;d rather look for<br>
&gt; something more general.<br>
&gt;<br>
&gt; Thanks for your comments so far. You&#39;re raising issues I have been thinking<br>
&gt; about for some time.<br>
&gt;<br>
&gt; Nigel<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Just thinking here<br>
&gt;<br>
&gt; Antonio<br>
&gt;<br>
&gt; On Mon, Aug 24, 2015 at 6:30 PM, Nigel Deakin &lt;<a href="mailto:nigel.deakin@oracle.com" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=nigel.deakin@oracle.com&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">nigel.deakin@oracle.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Over in the JMS 2.1 expert group I&#39;ve just published some proposals to<br>
&gt;&gt; allow any CDI managed bean in a Java EE<br>
&gt;&gt; application to listen for JMS messages. This would be implemented as a<br>
&gt;&gt; standard CDI portable extension and would become<br>
&gt;&gt; a mandatory part of a full Java EE 8 application server.<br>
&gt;&gt;<br>
&gt;&gt; I would welcome any comments from the CDI spec experts here. If you&#39;re<br>
&gt;&gt; interested in helping, please take a look at<br>
&gt;&gt; <a href="https://java.net/projects/jms-spec/pages/CDIBeansAsJMSListeners" rel="noreferrer" target="_blank">https://java.net/projects/jms-spec/pages/CDIBeansAsJMSListeners</a><br>
&gt;&gt; and send comments or questions to me or to the public<br>
&gt;&gt; <a href="mailto:users@jms-spec.java.net" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=users@jms-spec.java.net&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">users@jms-spec.java.net</a> alias.<br>
&gt;&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt;<br>
&gt;&gt; Nigel<br>
&gt;&gt; JMS 2.1 specification lead<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; cdi-dev mailing list<br>
&gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=cdi-dev@lists.jboss.org&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">cdi-dev@lists.jboss.org</a><br>
&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;&gt;<br>
&gt;&gt; Note that for all code provided on this list, the provider licenses the<br>
&gt;&gt; code under the Apache License, Version 2<br>
&gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other ideas<br>
&gt;&gt; provided on this list, the provider waives all patent and other intellectual<br>
&gt;&gt; property rights inherent in such information.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Antonio Goncalves<br>
&gt; Software architect, Java Champion and Pluralsight author<br>
&gt;<br>
&gt; Web site | Twitter | LinkedIn | Pluralsight | Paris JUG | Devoxx France<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; cdi-dev mailing list<br>
&gt; <a href="mailto:cdi-dev@lists.jboss.org" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=cdi-dev@lists.jboss.org&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">cdi-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
&gt;<br>
&gt; Note that for all code provided on this list, the provider licenses the code<br>
&gt; under the Apache License, Version 2<br>
&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other ideas<br>
&gt; provided on this list, the provider waives all patent and other intellectual<br>
&gt; property rights inherent in such information.<br>
_______________________________________________<br>
cdi-dev mailing list<br>
<a href="mailto:cdi-dev@lists.jboss.org" target="_blank" onclick="window.open(&#39;https://mail.google.com/mail/?view=cm&amp;tf=1&amp;to=cdi-dev@lists.jboss.org&amp;cc=&amp;bcc=&amp;su=&amp;body=&#39;,&#39;_blank&#39;);return false;">cdi-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
<br>
Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.<br>
</blockquote></div></div></div>