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

Pete Muir pmuir at redhat.com
Tue Dec 11 10:11:14 EST 2012


Agreed, managed bean is a well defined term:

" 3.1. Managed beans

A managed bean is a bean that is implemented by a Java class."

So I'm pretty sure producers aren't managed beans.


On 11 Dec 2012, at 16:07, Mark Struberg wrote:

> Actually I cannot read this restriction from the old wording. Please note that the terminus 'managed bean' is well defined and any producer method is a 'managed bean' as well as explicitly defined in the spec. This is not restricted to managed beans which are just classes imo.
> 
> LieGrue,
> strub
> 
> 
> 
> ----- Original Message -----
>> From: Pete Muir <pmuir at redhat.com>
>> To: Mark Struberg <struberg at yahoo.de>
>> Cc: Arne Limburg <arne.limburg at openknowledge.de>; cdi-dev <cdi-dev at lists.jboss.org>
>> Sent: Monday, December 10, 2012 1:37 PM
>> Subject: Re: [cdi-dev] Producer#dispose(T instance) and similar
>> 
>> 
>> On 7 Dec 2012, at 22:06, Mark Struberg wrote:
>> 
>>> Well, that restriction got only introduced with CDI-1.1.
>> 
>> CDI 1.0 didn't require an impl to support this. To quote:
>> 
>> "Interceptor bindings may be used to associate interceptors with any 
>> managed bean that is not itself an interceptor or decor- ator or with any EJB 
>> session or message-driven bean."
>> 
>> "Decorators may be associated with any managed bean that is not itself an 
>> interceptor or decorator or with any EJB session bean."
>> 
>> The restriction was just making it explicit, because people thought it should 
>> work.
>> 
>>> 
>>> I've not noticed that, what was the reason? There is no technical 
>> necessity to do that imo!
>> 
>> Maybe, but that isn't the way the spec is written in 1.0 :-) We can change 
>> it for sure, but it's a feature request.
>> 
>>> 
>>> I can see that for 
>>> 
>>> 
>>> @Produces @Transactional User getUser() {..}
>>> 
>>> 
>>> it is ambiguous whether the @Transactional interceptor should account for 
>> the method invocation or the produced bean. 
>>> But as Arne pointed out it is in CDI-1.0 very clear what should happen with 
>> 
>>> 
>>> @Produces @MyInterceptedStereotype User getUser() {}
>>> 
>>> Should we reopen CDI-59?
>>> 
>>> 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