【问题标题】:What is the expected behaviour of @PostConstruct in @Configuration classes?@Configuration 类中 @PostConstruct 的预期行为是什么?
【发布时间】:2014-07-03 07:51:18
【问题描述】:

我们正在重用一个项目,该项目使用 spring java-config(使用 @Configuration)定义了它的 bean,并且在一个这样的类中它有一个 @PostConstruct init 方法。

这里的预期行为是什么 - 何时调用此方法?关于豆类,就是这样。 IE。这个方法的行为是否与配置类是一个 bean 完全一样(实际上是一个 bean?)

我们观察到,根据操作系统,它可以在配置类中 @Autowired 的 bean 被初始化之前被调用,因此它最终以不完整的依赖关系工作。

【问题讨论】:

  • 在构造函数之后,以及依赖的自动装配完成之后。
  • 您注意到依赖于操作系统的差异吗?这很奇怪!当我在@Configuration 中有@PostContstruct 时,我没有遇到任何此类问题。每当我使用它时,都会在执行自动装配后调用它
  • 是的 - 有时在依赖 bean 初始化之前调用它,有时在初始化之后。
  • @Zhuinden 我的意思是关于其他豆类(我更新了问题)
  • +1 我没有任何想法(因为我从来没有遇到过这个问题,因此无法重现它),但是这个问题很有趣!

标签: java spring


【解决方案1】:

即使对于@Configuration@PostConstruct 的行为也符合预期——它在类的依赖项被注入后被调用。虽然这有点令人困惑(加上 @Configuration 类是 bean 的事实),但它是正确的。

手头的问题是在 spring-security-oauth 的帮助下引入了一个隐藏的循环依赖 - 这是一组复杂的配置,超出了本讨论的范围。

因此,只有在循环依赖的情况下,如果依赖 bean 未完全初始化,则可以调用 @PostConstruct。如果依赖项是通过 setter 或字段注入提供的,则不会报告循环依赖项,而是使用不完整的 bean。

这里还需要注意的是,循环依赖处理似乎取决于操作系统(这意味着一些 JVM 或 JRE 差异)。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多