Java @PostConstruct和继承的顺序

Java @PostConstruct和继承的顺序,java,jakarta-ee,dependency-injection,cdi,Java,Jakarta Ee,Dependency Injection,Cdi,假设我们有以下几类 public abstract class AbstractFoo { @PostConstruct private void doIt() { // } } public class Foo extends AbstractFoo { @PostConstruct private void doIt() { // } } 当AbstractFoo.doIt()和Foo.doIt()将被调用时

假设我们有以下几类

public abstract class AbstractFoo {

    @PostConstruct
    private void doIt() {
       //
    }
}

public class Foo extends AbstractFoo {

    @PostConstruct
    private void doIt() {
       //
    }
}
当AbstractFoo.doIt()和Foo.doIt()将被调用时-顺序是什么?

是在给定托管bean的初始化中相对于其在继承链中的位置执行的最后一件事。根据规范

容器必须确保:

  • 由bean的类型层次结构中的类X声明的初始值设定项方法(即
    @PostConstruct
    )在所有由X或X的超类声明的注入字段初始化后被调用

  • bean的类型层次结构中的类X声明的任何
    @PostConstruct
    回调都是在调用了X或X的超类声明的所有初始化器方法后调用的,在初始化了X或X的超类声明的所有注入字段后调用的


Pro提示:使用CDI2.0,作为另一种选择
@PostConstruct
,并且限制在给定类中只能有一个。这里的区别是,
@PostConstruct
仍然是最后执行的,并且是唯一可以保证所有注入组件都可用的地方。

我相信父类上的
@PostConstruct
没有被调用。只能有一个
@PostConstruct
方法。因此,不检查父类的方法。你需要通过
super.doIt()

明确地调用它,是什么阻止了你简单地尝试它?@luk2302我想得到规范的答案。我搜索了,但找不到。CDI 1.0中也提供了初始化方法!