【问题标题】:Order of @PostConstruct and inheritance@PostConstruct 的顺序和继承
【发布时间】:2017-08-27 15:05:32
【问题描述】:

假设我们有以下类

public abstract class AbstractFoo {

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

public class Foo extends AbstractFoo {

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

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

【问题讨论】:

  • 是什么阻止你尝试一下?
  • @luk2302 我想得到规范的答案。我搜索了但找不到。

标签: java jakarta-ee dependency-injection cdi


【解决方案1】:

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

容器必须确保:

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

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

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

【讨论】:

  • CDI 1.0 中也提供了初始化方法!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 2017-01-15
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多