使用 Kotlin BeanDefinitionDsl 时未调用 @PostConstruct

@PostConstruct not called when using Kotlin BeanDefinitionDsl

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

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

  1. 我分叉了 Spring 使用 Kotlin DSL 的示例 https://github.com/sdeleuze/spring-kotlin-functional
  2. 我向 UserHandler 添加了一个 @PostConstruct class。 (下面有更多详细信息。)
  3. 我把结果推送到这里:https://github.com/benjishults/spring-kotlin-functional

所以你需要做的就是 fork 我的 repo 并做一个 gradle 运行.

我的问题是:

  1. 既然我将 class 作为 bean 引入,难道我不应该期望调用 @PostConstruct 吗?
  2. 我是不是漏了一步?
  3. 这是 Spring 错误吗?

如果你不想提取我的回购协议,这里有更多关于我所做的事情的细节。我将其添加到 UserHandler class:

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

连同导入和 Gradle 依赖项。

UserHandler bean 通过调用 beans DSL 中的 bean 方法被拉入上下文,如下所示:

fun beans() = beans {
    bean<UserHandler>()
    // ...
}

并将其带入上下文:

beans().initialize(context)

GenericApplicationContext实例化在Applicationclass不支持开箱即用@PostContruct。要使其正常工作,您应该改用 AnnotationConfigApplicationContext 并在 Gradle 构建中删除 spring-aop 的排除项。