@PostConstruct和继承的顺序

Pav*_*l_K 7 java dependency-injection cdi jakarta-ee

假设我们有以下课程

public abstract class AbstractFoo {

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

public class Foo extends AbstractFoo {

    @PostConstruct
    private void doIt() {
       //
    }
}
Run Code Online (Sandbox Code Playgroud)

何时调用 AbstractFoo.doIt() 和 Foo.doIt() - 顺序是什么?

kol*_*sus 6

@PostConstruct是给定托管 bean 初始化时执行的最后一件事(相对于其在继承链中的位置)。从规格来看

容器必须确保:

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

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

专业提示:使用 CDI 2.0,您可以使用@Inject声明初始化方法作为替代方法@PostConstruct,并限制在给定类中只能有一个初始化方法。这里的区别在于它仍然@PostConstruct是最后执行的,并且是唯一可以保证所有注入的组件可用的地方。