2014-07-03 28 views
24

我们正在使用spring java-config(使用@Configuration)重用一个定义它的bean的项目,并且在一个这样的类中它有一个@PostConstruct init方法。@Configuration类中@PostConstruct的预期行为是什么?

这里的预期行为是什么 - 此方法何时被调用?就豆类而言,就是这样。即此方法的行为与配置类是否完全相同(实际上它是一个?)

我们观察到的是,根据操作系统的不同,它可以在配置为@Autowired的bean进入配置之前调用类被初始化,因此它最终会使用不完全的依赖关系。

+0

构造函数之后,依赖项的自动装配完成后。 – EpicPandaForce

+0

您注意到了在操作系统上的差异吗?这很奇怪!当我在@ Configuration中有'@ PostContstruct'时,我还没遇到过这样的问题。每当我使用它,在自动装配执行完毕后调用 – geoand

+0

是的 - 有时在相关的bean初始化之前调用它,有时在调用之后。 – Bozho

回答

16

即使对于@Configuration,@PostConstruct的行为也如预期的那样 - 在类的依赖关系被注入后它会被调用。虽然这有点令人困惑(与@Configuration类是bean类似的事实一起),但它是正确的。

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

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

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

相关问题