[cdi-dev] Are we always able to invoke @PreDestroy for @Dependent beans?
Mark Struberg
struberg at yahoo.de
Fri Mar 9 11:45:58 EST 2012
Well, I think the newly proposed wording is still fine (sharing the CreationalContext of the @Dependent beans created by Instance.get() with the InjectionPoint.
What we need to do is to point people at manually creating the beans if they don't like this behaviour.
In that case they still can use
BeanManager#getBeans + bm#resolve + bm#getReference
storing away the CreationalContext and later throw them away manually with bean.destroy.
LieGrue,
strub
----- Original Message -----
> From: Pete Muir <pmuir at redhat.com>
> To: Jozef Hartinger <jharting at redhat.com>
> Cc: Mark Struberg <struberg at yahoo.de>; cdi-dev <cdi-dev at lists.jboss.org>
> Sent: Thursday, March 8, 2012 11:35 PM
> Subject: Re: [cdi-dev] Are we always able to invoke @PreDestroy for @Dependent beans?
>
>T his is still an issue for Instance.get() :-(
>
> On 8 Mar 2012, at 15:47, Jozef Hartinger wrote:
>
>> I think you are wrong. The spec says:
>>
>> "Any instance of the bean injected into method parameters of a
> disposer
>> method or observer method exists to service the
>> method invocation only (except for observer methods of container
>> lifecycle events)."
>>
>> So the instance should actually be destroyed immediately after the
>> observer method invocation finishes.
>>
>> On 03/08/2012 01:47 PM, Mark Struberg wrote:
>>> My answer sadly is no.
>>>
>>> Dependent objects are stored in the CreationalContext which is held in
> the context which holds the outer NormalScoped contextual instance.
>>> If the outer NormalScoped contextual instance gets desroyed, we also
> properly destroy all @Dependent beans in the CreationalContext.
>>>
>>> So far so good, but now let's consider hte following scenario:
>>>
>>>
>>> @ApplicationScoped
>>> public class MyService {
>>>
>>> void doStats(@Observes RequestStatistics, UserHelper uh) {
>>>
>>>
>>> UserHelper is @Dependent and a new instance will get created each time
> doStats() gets called.
>>>
>>> What happens is that we don't know whether the UserHelper
> internally gets stored or just thrown away. In our sample most probably the
> later.
>>> Each UserHelper will get stored in the CreationalContext of our single
> MyService instance. After 500.000 requests, our CreationalContext would contain
> 500.000 UserHelpers. Not smart, eh? This would just create a fat memory leak...
>>>
>>>
>>> What we can do is to store only WeakReferences. E.g. via a WeakHashmap.
> This will automatically drop the entries if the instances in it get garbage
> collected. But in this case are not able to invoke @PreDestroy anymore I fear,
> because gone is gone ...
>>>
>>> LieGrue,
>>> strub
>>>
>>>
>>> _______________________________________________
>>> cdi-dev mailing list
>>> cdi-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>> _______________________________________________
>> cdi-dev mailing list
>> cdi-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>
More information about the cdi-dev
mailing list