使用Kotlin BeanDefinitionDsl时不会调用@PostConstruct

当使用Kotlin BeanDefinitionDsl将bean添加到上下文中时,似乎不会调用@PostConstruct方法。

这发生在我自己的项目中,但创建一个简单的方法来重现它,这就是我所做的。

  1. 我分叉使用Kotlin DSL的Spring示例https://github.com/sdeleuze/spring-kotlin-functional
  2. 我添加了@PostConstruct到UserHandler类。 (更多细节在下面)
  3. 我把结果推到这里: https : //github.com/benjishults/spring-kotlin-functional

所以你所要做的就是分叉我的回购,并做一个gradle运行。

我的问题是:

  1. 我不应该期望@PostConstruct被调用,因为我把这个类作为一个bean来使用吗?
  2. 我错过了一个步骤?
  3. 这是一个spring的bug?

如果你不想拉我的回购,这里是更多的细节,我做了什么。 我将其添加到UserHandler类:

@PostConstruct fun afterPropertiesSet() { System.out.println("AFTER PROPERTIES SET CALLED") } 

以及导入和Gradle依赖。

UserHandler bean被拉入到上下文中,使用一个调用bean beans的bean方法,如下所示:

 fun beans() = beans { bean() // ... } 

这是带来的上下文:

 beans().initialize(context) 

Application类中实例化的GenericApplicationContext不支持@PostContruct 。 为了使它工作,你应该使用AnnotationConfigApplicationContext来代替Gradle构建中的spring-aop排除。