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@gmail.com> wrote:

From: Stuart Douglas <stuart.w.douglas@gmail.com>
Subject: Re: [cdi-dev] @PostConstruct and @Inject methods in superclasses
To: "Mark Struberg" <struberg@yahoo.de>
Cc: "cdi-dev" <cdi-dev@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@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/cdi-dev