[weld-dev] Application scoped bean and its lifecycle
Martin Kouba
mkouba at redhat.com
Mon May 22 04:50:56 EDT 2017
Ok, now I know what's going on.
The event with payload "Application context initialized." comes directly
from Weld. Whereas the second one java.lang.Object at 48813e62 comes from
PAX CDI [1].
Up to version 2.2 Weld did not fire @Initialized/@Destroyed events for
@ApplicationScoped for non-web modules. The behavior changed in 2.3 -
see also WELD-1821 [2].
This explains the events fired twice.
WRT Test bean instance created twice - the problem is that
@Destroyed(ApplicationScoped.class) event is fired after the actual
destruction. So if you declare an observer on an @ApplicationScoped
you're entering the "undefined behavior zone". In Weld, the Test bean is
created again.
I've created WELD-2389 [3] to track this issue.
Thanks,
Martin
[1]
https://github.com/ops4j/org.ops4j.pax.cdi/blob/master/pax-cdi-weld/src/main/java/org/ops4j/pax/cdi/weld/impl/WeldCdiContainer.java#L154
[2]
https://issues.jboss.org/browse/WELD-1821
[3]
https://issues.jboss.org/browse/WELD-2389
Dne 22.5.2017 v 09:57 Alex Sviridov napsal(a):
> Hi Martin
>
> Thank you for your answer.
>
> 1) I don't inject Test class anywhere.
> 2) I modified init and destroy methods:
> public void init(@Observes @Initialized(ApplicationScoped.class)
> Object init) {
> System.out.println(init);
> System.out.println("Test was initialized");
> }
>
> public void destroy(@Observes @Destroyed(ApplicationScoped.class)
> Object init) {
> System.out.println(init);
> System.out.println("Test was destroyed.");
> }
>
> Now on bundle start:
>
> Test was created.
> Application context initialized.
> Test was initialized
> java.lang.Object at 48813e62
> Test was initialized
>
> Now on bundle stop:
>
> java.lang.Object at 48813e62
> Test was destroyed.
> Test was created.
> Application context destroyed.
> Test was destroyed.
>
>
> Понедельник, 22 мая 2017, 10:48 +03:00 от Martin Kouba
> <mkouba at redhat.com>:
>
> Hi Alex,
>
> this looks really weird. Could you try to print out the event payload,
> e.g. System.out.println(init)?
>
> Also you should be always very careful when using code inside the
> no-args constructor of a normal-scoped bean -> it will be also executed
> when creating a client proxy. In your case, if you do @Inject Test and
> invoke any method then you will also see "Test was created" printed
> twice.
>
> Martin
>
> Dne 22.5.2017 v 08:50 Alex Sviridov napsal(a):
> > Hi all
> >
> > I use pax-cdi -1.0.0.RC2 and weld 2.3.5.Final and this is my test
> class:
> >
> > import javax.enterprise.context.ApplicationScoped;
> > import javax.enterprise.context.Destroyed;
> > import javax.enterprise.context.Initialized;
> > import javax.enterprise.event.Observes;
> >
> > @ApplicationScoped
> > public class Test {
> >
> > public Test() {
> > System.out.println("Test was created.");
> > }
> >
> > public void init(@Observes @Initialized(ApplicationScoped.class)
> Object
> > init) {
> > System.out.println("Test was initialized");
> > }
> >
> > public void destroy(@Observes @Destroyed(ApplicationScoped.class)
> > Object init) {
> > System.out.println("Test was destroyed.");
> > }
> > }
> >
> > When I start test-bundle I see the following output:
> > Test was created.
> > Test was initialized
> > Test was initialized
> > When I stop test-bundle I see the following output:
> > Test was destroyed.
> > Test was created.
> > Test was destroyed.
> >
> > So as result this bean was two times created, two times
> initialized and two
> > times destroyed.
> >
> > I expected that this bean must be once created, one initialized
> and once
> > destroyed.
> >
> > Is this a bug that must be reported or my mistake?
> >
> > --
> > Alex Sviridov
> >
> >
> > _______________________________________________
> > weld-dev mailing list
> > weld-dev at lists.jboss.org <mailto:weld-dev at lists.jboss.org>
> > https://lists.jboss.org/mailman/listinfo/weld-dev
> >
>
> --
> Martin Kouba
> Senior Software Engineer
> Red Hat, Czech Republic
>
>
>
> --
> Alex Sviridov
--
Martin Kouba
Senior Software Engineer
Red Hat, Czech Republic
More information about the weld-dev
mailing list