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

Mark Struberg struberg at yahoo.de
Thu Mar 8 14:27:17 EST 2012


Oh, a hidden gem - thanks for finding :)

Btw, this sentence misses producer methods, or are they intentionally left out? It's not so clear for them.

LieGrue,
strub



----- Original Message -----
> From: Jozef Hartinger <jharting at redhat.com>
> To: Mark Struberg <struberg at yahoo.de>
> Cc: cdi-dev <cdi-dev at lists.jboss.org>
> Sent: Thursday, March 8, 2012 4:47 PM
> Subject: Re: [cdi-dev] Are we always able to invoke @PreDestroy for @Dependent beans?
> 
> 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
> 



More information about the cdi-dev mailing list