[cdi-dev] @PostConstruct and @Inject methods in superclasses

Stuart Douglas stuart.w.douglas at gmail.com
Sat Oct 1 09:21:47 EDT 2011


On 01/10/2011, at 7:47 PM, Mark Struberg wrote:

> Oki found it there:
>> most general superclass first.
> of course the interceptors_spec_1_1 only defines this for 'Lifycycle interceptors' 

The spec is not very clear on this point, but @PostConstruct methods on a bean are considered lifecycle interceptors. There is actually a fair bit of deviation between CDI and the interceptors and Managed bean spec on some points: 

- CDI beans don't support interceptor methods on the beans themselves (at least Weld does not, the interceptors spec allows you to have an @AroundInvoke method on the managed bean itself).
- @Resource @Psersitence* @EJB etc annotation of CDI managed beans do not create JNDI bindings like they are supposed to according to the EE platform spec.

As far as I know no one actually really uses these 'features' anyway, but it is a deviation from the spec that we should probably clarify.

Stuart


> 
> But what about my example 4, the shared @Inject method + @PostConstruct case?
> Do we need to invoke all superclass injection first? thus do all @Inject fields + @Inject methods + @PostConstruct first, then the one from the Horse class?
> Could we also specify that all @Inject methods needs to get called before @PostConstruct?
> 
> txs and LieGrue,
> strub
> 
> --- On Fri, 9/30/11, Stuart Douglas <stuart.w.douglas at gmail.com> wrote:
> 
>> From: Stuart Douglas <stuart.w.douglas at gmail.com>
>> Subject: Re: [cdi-dev] @PostConstruct and @Inject methods in superclasses
>> To: "Mark Struberg" <struberg at yahoo.de>
>> Cc: "cdi-dev" <cdi-dev at lists.jboss.org>
>> Date: Friday, September 30, 2011, 9:58 PM
>> 
>> This is actually covered by the interceptors specification,
>> from memory I am pretty sure the base class method is mean't
>> to be called first, but the spec gives you the full order. 
>> 
>> @Inject methods are called before @PostConstuct (the are
>> called in InjectionTarget.inject, which gets called before
>> InjectionTarget.postConstruct).
>> 
>> I don't think we specify an order for @Inject methods.
>> 
>> Stuart
>> 
>> On 01/10/2011, at 5:47 AM, Mark Struberg wrote:
>> 
>>> Hi!
>>> 
>>> JSR-250 common annotations is pretty thin about having
>> @PostConstruct in multiple class hierarchies. It just says
>> that there must only be one single method annotated with
>> @PostConstruct in a class. Thus my question:
>>> 
>>> If I have 
>>> 
>>> 
>>> public class Animal {
>>>   @PostConstruct
>>> 
>>>   public void doInit() {..}
>>>   ..
>>> 
>>> }
>>> 
>>> and 
>>> 
>>>   public class Horse extends Animal {
>>>   @PostConstruct
>>> 
>>>   public void doSomeOtherInit() {..}
>>>   ..
>>> 
>>> }
>>> 
>>> 
>>> 1.) for a contextual instance of Horse, will
>> Animal#doInit() get executed or only the one from the
>> 'effective' class?
>>> 2.) if 1.) was yes, then In which order do they get
>> executed? Is this specced somewhere?
>>> 
>>> 3.) Same scenario with @Inject methods. Do we specify
>> an order?
>>> 
>>> 4.) Both classes have @Inject methods and
>> @PostConstruct. Again: which order of invocaition?
>>> 
>>> 
>>> Just that you understand my intention: we had a
>> @PostConstruct method in Horse which did set a 'cached' flag
>> in Animal. Turned out that this was a random generator
>> depending on the intsalled server ;)
>>> 
>>> 
>>> LieGrue,
>>> strub
>>> 
>>> _______________________________________________
>>> cdi-dev mailing list
>>> cdi-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>> 
>> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/cdi-dev/attachments/20111001/2e4ae4bb/attachment-0001.html 


More information about the cdi-dev mailing list