@PostConstruct和继承的顺序

时间:2017-08-27 15:05:33

标签: java java-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()时 - 命令是什么?

2 个答案:

答案 0 :(得分:4)

@PostConstruct是在给定托管bean的初始化中执行的 last 事件,相对于它在继承链中的位置。来自规范

  

容器必须确保:

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

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

  •   

专业提示:使用CDI 2.0,you can use @Inject to declare an initializer method作为替代@PostConstruct,并且您可以在给定的课程中只拥有一个限制。这里的不同之处在于@PostConstruct 仍然最后执行,这是唯一可以保证所有注入的组件都可用的地方。

答案 1 :(得分:0)

我相信没有调用父类上的 @PostConstruct。只能有一种 @PostConstruct 方法。所以不检查父类的方法。您需要通过 super.doIt()

显式调用它