首页 > 解决方案 > 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 时不会发生问题?

标签: javaspringspring-boot

解决方案


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

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

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

为 spring-boot 创建票证(因为它仅在引导自动配置期间发生): 问题 #20219


推荐阅读