【发布时间】: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