[cdi-dev] Are we always able to invoke @PreDestroy for @Dependent beans?

Pete Muir pmuir at redhat.com
Fri Mar 9 11:47:32 EST 2012


I would propose we add Instance.destroy() as well, to make it easier…

On 9 Mar 2012, at 16:45, Mark Struberg wrote:

> 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