gpt4 book ai didi

java - 如何通过动态创建spring bean的行为使@ConditionalOnMissingBean工作(例如: beanfactory register)

转载 作者:行者123 更新时间:2023-11-30 05:39:20 25 4
gpt4 key购买 nike

我正在写一个spring boot starter,想实现动态创建bean注入(inject)到spring ioc中,并且可以在不创建默认bean的情况下让@ConditionalOnMissingBean生效。

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

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;
while (iterator.hasNext()) {
// Generate a bean based on the configuration
...
SpringBean bean = ...
configurableBeanFactory.registerSingleton(SpringBeanName, bean);
}

我希望如果bean是动态创建的,@ConditionalOnMissingBean仍然有效。

最佳答案

正如 API documentation 中所述:

The @Conditional annotation may be used in any of the following ways:

  • as a type-level annotation on any class directly or indirectly annotated with @Component, including @Configuration classes
  • as a meta-annotation, for the purpose of composing custom stereotype annotations
  • as a method-level annotation on any @Bean method

这意味着它不会对启动后在 ApplicationContext 中注册的动态创建的 bean 产生影响。因此,当您想要实现类似的行为时,请尝试检查 ApplicationContext 中是否存在 bean,如下所示:

@Autowired
private ApplicationContext context;

...
context.getBeansOfType(YourType.class).isEmpty()

更新:

当您想要摆脱该 bean 的默认配置时,您需要将其排除。有两种方法可以实现这一目标。通过像 @SpringBootApplication(exclude = SomeConfig.class) 那样指定来排除定义 bean 的整个配置文件,或者在 @ComponentScan 上实现您自己的排除过滤器。 .

关于java - 如何通过动态创建spring bean的行为使@ConditionalOnMissingBean工作(例如: beanfactory register),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55988702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com