Java 如何通过动态创建Springbean(例如:beanfactory寄存器)的行为使@ConditionalOnMissingBean工作
我正在编写一个spring启动程序,我想在spring ioc中实现bean注入的动态创建,并且可以在不创建默认bean的情况下使@ConditionalOnMissingBean生效 我试图在configuration类中直接编织beanfactory,并通过ConfigurableBeanFactory调用registerSingleton方法动态创建bean,但结果是错误的,@ConditionalOnMissingBean无效@Bean还可以,这应该与spring boot scan@Configuration类和相应的@Bean方法有关,但是@Bean无法实现Bean的动态创建,因为我需要的Bean是根据配置文件的内容生成的,数量不确定,内容不确定Java 如何通过动态创建Springbean(例如:beanfactory寄存器)的行为使@ConditionalOnMissingBean工作,java,spring,spring-boot,Java,Spring,Spring Boot,我正在编写一个spring启动程序,我想在spring ioc中实现bean注入的动态创建,并且可以在不创建默认bean的情况下使@ConditionalOnMissingBean生效 我试图在configuration类中直接编织beanfactory,并通过ConfigurableBeanFactory调用registerSingleton方法动态创建bean,但结果是错误的,@ConditionalOnMissingBean无效@Bean还可以,这应该与spring boot scan@C
@覆盖
public void setBeanFactory(BeanFactory BeanFactory)抛出BeanException{
this.beanFactory=beanFactory;
ConfigurableBeanFactory ConfigurableBeanFactory=(ConfigurableBeanFactory)beanFactory;
while(iterator.hasNext()){
//根据配置生成bean
...
春豆豆=。。。
可配置BeanFactory.registerSingleton(SpringBeanName,bean);
}
如果bean是动态创建的,我希望@ConditionalOnMissingBean仍然会生效。正如其在:
@Conditional注释可通过以下任一方式使用:
- 作为使用@Component直接或间接注释的任何类的类型级注释,包括@Configuration类
- 作为元注释,用于编写自定义原型注释
- 作为任何@Bean方法上的方法级注释
ApplicationContext
中注册的动态创建bean产生影响。
因此,当您想要实现类似的行为时,请尝试检查ApplicationContext中是否存在bean,如下所示:
@Autowired
私有应用程序上下文上下文;
...
context.getBeansOfType(YourType.class).isEmpty()
更新:
当您想要摆脱该bean的默认配置时,您需要将其排除在外。有两种方法可以实现这一点。或者通过像
@SpringBootApplication(exclude=SomeConfig.class)那样指定该bean定义的整个配置文件来排除该bean
或通过在上实现您自己的排除过滤器。这是一个好主意,但@Conditional*决策在公共jar中,我无法自定义。非常感谢,我将参考您的建议。当它解决您的问题时,请接受答案,为发现此问题的其他人标记它。