【问题标题】:Beans created by ImportBeanDefinitionRegistrar during autoconfiguration are not eligible for all bean postprocessors在自动配置期间由 ImportBeanDefinitionRegistrar 创建的 bean 不适用于所有 bean 后处理器
【发布时间】:2020-02-18 13:18:00
【问题描述】:

我已经实现 ImportBeanDefinitionRegistrar 从外部源创建 bean 定义。它必须是注册器,因为我事先不知道会创建多少个 bean 定义。

当我像这样在我的应用程序类上使用注册器时:

@SpringBootApplication
@Import(GenesysRegistrar.class)
public class IntegrationServer {
...
}

一切正常。

我想让每个使用包含注册器的 JAR 的应用程序自动导入,所以我创建了以下类:

@Configuration
@Import(GenesysRegistrar.class)
public class GenesysAutoConfiguration {
    /**/
}

并在 META-INF/spring.factories 中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键下注册。

现在自动配置有效,但我在日志中收到以下消息:

Bean 'xxx' of type [XXX] is not eligible for getting processed by all BeanPostProcessors

从应用程序类和自动配置类导入注册表有什么区别?我发现以下后处理器是在我的 bean 之后创建的:

methodValidationPostProcessor
persistenceExceptionTranslationPostProcessor
webServerFactoryCustomizerBeanPostProcessor
errorPageRegistrarBeanPostProcessor

我尝试将@AutoConfigureOrder(Integer.MAX_VALUE) 放在我的自动配置类中,但它并没有改变任何东西。

任何想法如何修复订单,以便我的注册商创建的定义中的 bean 在所有后处理器之后处理?为什么 Spring 在所有后处理器之前创建它们?为什么在应用程序类上使用@Import 时不会发生问题?

【问题讨论】:

  • 似乎根本原因是 ValidationAutoConfiguration 定义了 methodValidationPostProcessor 需要自动装配环境(没有@Lazy)。在搜索环境时,Spring 会触发我的注册商定义的 bean 的急切初始化。由于(至少 methodValidationPostProcessor)尚未创建,因此我收到“不合格”警告。现在我想知道在 Environment 上缺少 @Lazy 是否是我将向 Spring 报告的“错误”。

标签: java spring spring-boot


【解决方案1】:

早期初始化的bean是通过构造函数注入注入到其他bean工厂的依赖项。

如果 bean 工厂使用属性注入而不是构造注入,则不会发生。

问题是工厂 bean 上的构造函数注入是否是“不好的做法” - 没有发现任何禁止它的东西。

创建了 spring-boot 的票(因为它只在启动自动配置期间发生): Issue #20219

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多