WELD/CDI event clarifications

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

WELD/CDI event clarifications

Eric B
I apologize if this not the correct forum to post this question, but I tried looking at the Weld forums and everything appears dormant (even the link to the user's forum is 404 on the Weld site).  So I suspected this would be the second best place to ask for some clarity.

I'm trying to understand the sequencing of CDI events vs bean initialization.  I'm currently concentrating on CDI 1.2/Weld 2.3.5, but figure that this information will be applicable to CDI2.0 as well.   I've tried finding documentation online and posting on StackOverflow and neither have produced any results.  Specifically, I am confused about the sequencing of CDI events vs when/how bean methods are called.  Given what I have read, the following are the events that are triggered by the CDI container:
  • BeforeBeanDiscovery
  • ProcessAnnotatedType and ProcessSyntheticAnnotatedType
  • AfterTypeDiscovery
  • ProcessInjectionTarget and ProcessProducer
  • ProcessInjectionPoint
  • ProcessBeanAttributes
  • ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField
  • ProcessObserverMethod
  • AfterBeanDiscovery
  • AfterDeploymentValidation
  • BeforeShutdown
Given these events, when are the events which produce @Initialized(ApplicationScoped.class) and @Destroyer(ApplicationScoped.class) triggered?  In which part of the lifecycle?  Are they triggered in the @PostConstruct equivalent of the Scoping bean (what is the bean backing the ApplicationScope?  I cannot find the implementation in the Weld core - am I even looking in the right place?)?

Which brings me to the next question - in which stage of the container setup are the @PostConstruct methods on the beans called?  Are they called in the `AfterDeploymentValidation` phase?  Or is it somewhat asynchronous - in that the @PostConstruct of an ApplicationScoped bean will be called only when initialized; and that could happen during any of the stages?  From what I understand, the BeanManager.getReference() is not allowed prior to the AfterDeploymentValidation event being fired, which to me would imply that beans can only be instantiated (and therefore @PostConstruct'ed) after the `AfterDeploymentValidation` phase. 

Can anyone direct me towards some clarification of these points?  I've tried reading the CDI 1.2 user guide (https://docs.jboss.org/cdi/learn/userguide/CDI-user-guide.html), but that hasn't provided the details I am looking for.  Additionally, I've tried reading through the Weld code but can't find the answers I'm looking for.

Thanks,

Eric

_______________________________________________
wildfly-dev mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/wildfly-dev
Reply | Threaded
Open this post in threaded view
|

Re: WELD/CDI event clarifications

Martin Kouba
Hi Eric,

Weld forum is indeed inaccessible. I don't know what the problem is but
we'll try to make it work ASAP. Anyway, there are other channels
mentioned on the weld site [1].

WRT your questions - I added few comments inline.

HTH

Martin

[1]
weld/user on Gitter
#weld-dev IRC channel hosted on freenode.net
  weld-dev mailing list - https://lists.jboss.org/mailman/listinfo/weld-dev



Dne 12. 11. 18 v 15:56 Eric B napsal(a):

> I apologize if this not the correct forum to post this question, but I
> tried looking at the Weld forums and everything appears dormant (even
> the link to the user's forum is 404 on the Weld site).  So I suspected
> this would be the second best place to ask for some clarity.
>
> I'm trying to understand the sequencing of CDI events vs bean
> initialization.  I'm currently concentrating on CDI 1.2/Weld 2.3.5, but
> figure that this information will be applicable to CDI2.0 as well.  
>   I've tried finding documentation online and posting on StackOverflow
> and neither have produced any results.  Specifically, I am confused
> about the sequencing of CDI events vs when/how bean methods are called.  
> Given what I have read, the following are the events that are triggered
> by the CDI container:
>
>   * BeforeBeanDiscovery
>   * ProcessAnnotatedType and ProcessSyntheticAnnotatedType
>   * AfterTypeDiscovery
>   * ProcessInjectionTarget and ProcessProducer
>   * ProcessInjectionPoint
>   * ProcessBeanAttributes
>   * ProcessBean, ProcessManagedBean, ProcessSessionBean,
>     ProcessProducerMethod and ProcessProducerField
>   * ProcessObserverMethod
>   * AfterBeanDiscovery
>   * AfterDeploymentValidation
>   * BeforeShutdown

These are container lifecycle events that can be observed on CDI
extensions only and the contract is well described in the spec:
http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#initialization

>
> Given these events, when are the events which produce
> @Initialized(ApplicationScoped.class)
> and @Destroyer(ApplicationScoped.class) triggered?  

@Initialized/@Destroyed(/@Predestroyed in 2.0) are regular events that
can be observed by regular beans. For example
@Initialized(ApplicationScoped.class) events are fired once the
application context is initialized.

Now "when is @Initialized(ApplicationScoped.class) fired?" - this is a
little bit more complicated. It depends on the target runtime (WildFly,
Weld SE, Tomcat, ...) and the deployment structure (WAR, EJB, etc.).

E.g. in WildFly, for beans located in a WAR the event payload is
ServletContext and is fired during
ServletContextListener#contextInitialized() notification. For other
types of archives (EJB etc.) the event payload is java.lang.Object and
is fired after the Weld container is fully initialized.

In SE, the event is fired after the WeldContainer is initialized.

> In which part of the
> lifecycle?  Are they triggered in the @PostConstruct equivalent of the
> Scoping bean (what is the bean backing the ApplicationScope?  I cannot
> find the implementation in the Weld core - am I even looking in the
> right place?)?

I'm not sure what you mean here. A @PostConstruct callback is invoked
after a contextual instance has been constructed and dependency
injection on that instance has been completed, but before this instance
is put into service.

So if you declare an @Initialized(ApplicationScoped.class) observer on a
bean the observer is always notified after the @PostConstruct callback.

>
> Which brings me to the next question - in which stage of the container
> setup are the @PostConstruct methods on the beans called?  Are they
> called in the `AfterDeploymentValidation` phase?  

No. @PostConstruct callbacks are invoked once a contextual instance is
created. Contextual instances are created lazily, on demand. This means
that @PostConstruct callbacks are called anytime after
AfterDeploymentValidation event is fired but before the application
shuts down.

> Or is it somewhat
> asynchronous - in that the @PostConstruct of an ApplicationScoped bean
> will be called only when initialized; and that could happen during any
> of the stages?  From what I understand, the BeanManager.getReference()
> is not allowed prior to the AfterDeploymentValidation event being fired,
> which to me would imply that beans can only be instantiated (and
> therefore @PostConstruct'ed) after the `AfterDeploymentValidation` phase.
>
> Can anyone direct me towards some clarification of these points?  I've
> tried reading the CDI 1.2 user guide
> (https://docs.jboss.org/cdi/learn/userguide/CDI-user-guide.html), but
> that hasn't provided the details I am looking for.  Additionally, I've
> tried reading through the Weld code but can't find the answers I'm
> looking for.
>
> Thanks,
>
> Eric
>
> _______________________________________________
> wildfly-dev mailing list
> [hidden email]
> https://lists.jboss.org/mailman/listinfo/wildfly-dev
>

--
Martin Kouba
Senior Software Engineer
Red Hat, Czech Republic
_______________________________________________
wildfly-dev mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/wildfly-dev