Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过动态创建Springbean(例如:beanfactory寄存器)的行为使@ConditionalOnMissingBean工作_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何通过动态创建Springbean(例如:beanfactory寄存器)的行为使@ConditionalOnMissingBean工作

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

我正在编写一个spring启动程序,我想在spring ioc中实现bean注入的动态创建,并且可以在不创建默认bean的情况下使@ConditionalOnMissingBean生效

我试图在configuration类中直接编织beanfactory,并通过ConfigurableBeanFactory调用registerSingleton方法动态创建bean,但结果是错误的,@ConditionalOnMissingBean无效@Bean还可以,这应该与spring boot scan@Configuration类和相应的@Bean方法有关,但是@Bean无法实现Bean的动态创建,因为我需要的Bean是根据配置文件的内容生成的,数量不确定,内容不确定

@覆盖
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中,我无法自定义。非常感谢,我将参考您的建议。当它解决您的问题时,请接受答案,为发现此问题的其他人标记它。