[cdi-dev] Producer#dispose(T instance) and similar

Pete Muir pmuir at redhat.com
Wed Dec 5 16:32:41 EST 2012


Why do they need to take creationalContext, that is what I am missing.

On 5 Dec 2012, at 20:33, Mark Struberg wrote:

> Oki, sounds ok so far. 
> 
> What about InjectionTarget<T> ?
> 
> InjectionTarget#postConstruct(T instance)
> InjectionTarget#preDestroy(T instance)
> 
> 
> They don't have a CreationalContext parameter. Where do they take the interceptors? And of course there _are_ interceptors allowed for InjectionTargets imo.
> That could only work if 'instance' is a proxy already, isn't?
> 
> 
> LieGrue,
> strub
> 
> 
> 
> ----- Original Message -----
>> From: Pete Muir <pmuir at redhat.com>
>> To: Arne Limburg <arne.limburg at openknowledge.de>
>> Cc: Mark Struberg <struberg at yahoo.de>; cdi-dev <cdi-dev at lists.jboss.org>
>> Sent: Wednesday, December 5, 2012 4:55 PM
>> Subject: Re: [cdi-dev] Producer#dispose(T instance) and similar
>> 
>> Hey Arne,
>> 
>> No, they can't :-) It's specifically called out in Chapter 8 and Chapter 
>> 9 that decorators and interceptors aren't applied to the result of producer 
>> methods.
>> 
>> Pete
>> 
>> On 5 Dec 2012, at 14:47, Arne Limburg wrote:
>> 
>>> Hi Pete,
>>> 
>>> 
>>> A little of topic and I don't want to disturb your discussion, but:
>>> 
>>> Beans produced by producer methods CAN have interceptors as stereotypes
>>> are supported on producer methods.
>>> 
>>> Cheers,
>>> Arne
>>> 
>>> Am 04.12.12 17:46 schrieb "Pete Muir" unter 
>> <pmuir at redhat.com>:
>>> 
>>>> Hi Mark, I'll try to answer inline, but I'm missing a bit of 
>> background
>>>> about what you are doing...
>>>> 
>>>> On 4 Dec 2012, at 14:20, Mark Struberg wrote:
>>>> 
>>>>> Another problem probably being an interceptor on the @Disposes 
>> method
>>>>> itself.
>>>>> Where does the Proucer#dispose(T instance) get the interceptor 
>> from?
>>>>> 
>>>>> LieGrue,
>>>>> strub
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> ----- Original Message -----
>>>>>> From: Mark Struberg <struberg at yahoo.de>
>>>>>> To: cdi-dev <cdi-dev at lists.jboss.org>
>>>>>> Cc: 
>>>>>> Sent: Tuesday, December 4, 2012 3:16 PM
>>>>>> Subject: [cdi-dev] Producer#dispose(T instance) and similar
>>>>>> 
>>>>>> Hi!
>>>>>> 
>>>>>> I'm currently stumbling over implementing
>>>>>> 
>>>>>> Producer#dispose(T instance) properly
>>>>>> 
>>>>>> The Producer#produce(CreationalContext)
>>>>>> 
>>>>>> has the CreationalContext parameter but the dispose
>>>> 
>>>> Right, it would have been good to have included it here. I'm not 
>> sure why
>>>> it wasn't, however I don't believe that it causes a problem 
>> with the CDI
>>>> 1.0 spec, but just limits us going forward.
>>>> 
>>>>>> and others do not have it.
>>>> 
>>>> Yes.
>>>> 
>>>>>> 
>>>>>> Problem here is that a Producer could probably get exchanged 
>> via a
>>>>>> portable 
>>>>>> extension via ProcessProducer#setProducer(Producer)
>>>> 
>>>> Yes, this is definitely supported
>>>> 
>>>>>> so it could be from a
>>>>>> foreign source which must not know anything about container
>>>>>> implementation 
>>>>>> details.
>>>> 
>>>> Yes.
>>>> 
>>>> I think the critical part of the spec to understand this is 11.2. 
>> I'm
>>>> quoting here from the CDI 1.1 spec, into which we have add the
>>>> clarification that "The instance returned by produce() may be a 
>> proxy.".
>>>> The part about building interceptors and decorators is there in CDI 
>> 1.0.
>>>> 
>>>>> For a Producer that represents a class:
>>>>> 
>>>>>     € produce() calls the constructor annotated @Inject if it 
>> exists, or
>>>>> the constructor with no parameters otherwise, as defined in
>>>>> [instantiation], and returns the resulting instance. If the class 
>> has
>>>>> interceptors,produce() is responsible for building the interceptors 
>> and
>>>>> decorators of the instance. The instance returned by produce() may 
>> be a
>>>>> proxy.
>>>>> 
>>>>>     € dispose() does nothing.
>>>> 
>>>> and
>>>> 
>>>>> For a Producer that represents a producer method or field:
>>>>> 
>>>>>     € produce() calls the producer method on, or accesses the 
>> producer
>>>>> field of, a contextual instance of the bean that declares the 
>> producer
>>>>> method, as defined in [methods].
>>>>> 
>>>>>     € dispose() calls the disposer method, if any, on a contextual
>>>>> instance of the bean that declares the disposer method, as defined 
>> in
>>>>> [methods], or performs any additional required cleanup, if any, to
>>>>> destroy state associated with a resource.
>>>> 
>>>> Now, let me start to break down your sentence :-)
>>>> 
>>>>>> 
>>>>>> What now about having an interceptor on @PreDestroy?
>>>> 
>>>> For a start, it's worth remembering interceptors can only be 
>> associated
>>>> with beans defined by a class. If the bean is a producer, then you 
>> can't
>>>> intercept the instance produced (only the invocation of the producer).
>>>> 
>>>>>> This is what you get if
>>>>>> your interceptor has a at PreDestroy method himself as per the
>>>>>> interceptors and EJB
>>>>>> specs. That would mean that the instance passed to dispose() 
>> whould be
>>>>>> the 
>>>>>> proxy? That purely sounds wrong to me.
>>>> 
>>>> Based on my comment from above, I think it's clear that dispose() 
>> should
>>>> never try to invoke predestroy methods. That is the job of
>>>> InjectionTarget.preDestroy(). I would expect a proxy to be passed to
>>>> preDestroy().
>>>> 
>>>>> 
>>>>> 
>>>>>> 
>>>>>> Another issue being InjectionTarget#postConstruct() only having 
>> the
>>>>>> instance T 
>>>>>> as well. Now what about @PostConstruct interceptors as defined 
>> in the
>>>>>> interceptors spec?
>>>> 
>>>> Again, I would expect a proxy to be passed to postConstruct(). Anyway,
>>>> I'm not sure why you need access to the creational context in the
>>>> postConstruct()? Here you should just invoke the postConstruct 
>> callback,
>>>> which should create any new dependent objects.
>>>> 
>>>>>> Currently we have a dirty hack in OWB to pass over the
>>>>>> CreationalContext which
>>>>>> contains the dependent scoped interceptors for our own 
>> Producers and
>>>>>> InjectionTargets. But I have no clue yet how that should get
>>>>>> implemented if one
>>>>>> plugs in a portable Producer via an Extension ^^
>>>>>> 
>>>>>> Who is responsible of performing the interception? The 
>> Producer? Or
>>>>>> must the 
>>>>>> instance being handed into already be a Proxy?
>>>> 
>>>> The instance returned from produce() should have interceptors and
>>>> decorators applied.
>>>> 
>>>> Please let me know if above makes sense, it took me a while to work out
>>>> whether what was defined was sane. After quite a lot of thinking +
>>>> talking to Jozef and Stuart I came to the conclusion it was, but  if 
>> you
>>>> can poke holes then please do!
>>>> _______________________________________________
>>>> 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