java - ImportBeanDefinitionRegistrar 在自动配置期间创建的 bean 不适用于所有 bean 后处理器
问题描述
我已经实现了 ImportBeanDefinitionRegistrar 从外部源创建 bean 定义。它必须是注册器,因为我事先不知道将创建多少个 bean 定义。
当我像这样在我的 Application 类上使用注册器时:
@SpringBootApplication
@Import(GenesysRegistrar.class)
public class IntegrationServer {
...
}
一切正常。
我想让每个使用包含注册器的 JAR 的应用程序自动导入,所以我创建了以下类:
@Configuration
@Import(GenesysRegistrar.class)
public class GenesysAutoConfiguration {
/**/
}
并在 META-INF/spring.factories 的 key 下注册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 时不会发生问题?
解决方案
早期初始化的 bean 是通过构造函数注入注入到其他 bean 工厂的依赖项。
如果 bean 工厂使用属性注入而不是构造注入,则不会发生。
问题是工厂 bean 上的构造函数注入是否是“不好的做法” - 没有发现任何禁止它的东西。
为 spring-boot 创建票证(因为它仅在引导自动配置期间发生): 问题 #20219
推荐阅读
- azure - azure devops if else 条件
- python - 如何获取日期范围的每小时分钟数(Python)?
- node.js - 如果可以生成预签名的 url 以在 S3 对象上执行 SELECT 命令?
- javascript - 如何使用 chrome 扩展更改网站文本?
- python - 如何部署此 Web 应用程序?
- c - 为什么在 switch 中使用浮点数不起作用?
- python - 如何返回 JSON 以便可以使用点表示法访问它?
- java - 将参数传递给 java 注释
- neoscms - Neos.Form.Builder:将回复地址设置为用户填写联系表时输入的电子邮件
- plot - 当 Y 变量是一个热编码时如何解释决策树图