使用Kotlin BeanDefinitionDsl时不会调用@PostConstruct
当使用Kotlin BeanDefinitionDsl将bean添加到上下文中时,似乎不会调用@PostConstruct方法。
这发生在我自己的项目中,但创建一个简单的方法来重现它,这就是我所做的。
- 我分叉使用Kotlin DSL的Spring示例https://github.com/sdeleuze/spring-kotlin-functional
- 我添加了@PostConstruct到UserHandler类。 (更多细节在下面)
- 我把结果推到这里: https : //github.com/benjishults/spring-kotlin-functional
所以你所要做的就是分叉我的回购,并做一个gradle运行。
我的问题是:
- 我不应该期望@PostConstruct被调用,因为我把这个类作为一个bean来使用吗?
- 我错过了一个步骤?
- 这是一个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
排除。