【发布时间】:2019-04-03 23:43:09
【问题描述】:
我正在尝试在 Spring Boot 中动态注册 Bean,但是如果尝试自动装配其中一个动态 bean,则创建 bean 的顺序总是会导致 NoSuchBeanDefinitionException。
我的设置包括两个项目,一个 spring-boot-starter 项目和实际的 spring-boot 应用程序。
实际的应用程序注册了一个BeanDefinitionRegistryPostProcessor,它添加了 bean 定义。实例本身是通过在启动项目中定义的另一个 bean 构建的,该项目本身将另一个 bean 作为依赖项。
为了使用动态注册的 bean,我创建了一个用 @Component 注释的类,并定义了一个期望该 bean 作为参数的构造函数。
当我通过设置@Autowired(required=false) 调试应用程序时,我可以看到在创建动态bean 之前调用了我的组件的构造函数。而且,当时连工厂 bean 都没有创建。
将带有工厂 bean 名称的 @DependsOn 添加到组件导致首先创建工厂,而不是动态 bean。
使用动态 bean 的名称设置 @DependsOn 有效,但这似乎不是解决此问题的正确方法。
为什么 Spring 以错误的顺序创建我的 bean,我能做些什么来解决这个问题?
编辑:
我能够在示例存储库中重现该问题:
https://github.com/maveeee/spring-dynamic-bean-demo/
【问题讨论】:
标签: java spring spring-boot spring-boot-starter