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

qihua Tang :

我正在编写一个Spring Boot Starter,我想在Spring IOC中实现Bean注入的动态创建,并且可以使@ConditionalOnMissingBean生效而无需创建默认Bean。

我试图直接在配置类中编织beanfactory,并通过ConfigurableBeanFactory调用registerSingleton方法来动态创建bean,但是结果是错误的,@ ConditionalOnMissingBean无效。@Bean可以,这应该与spring boot scan @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文档中所述

@Conditional批注可以通过以下任何一种方式使用:

  • 作为任何直接或间接用@Component注释的类的类型级别注释,包括@Configuration类
  • 作为元注释,目的是组成自定义构造型注释
  • 作为任何@Bean方法上的方法级注释

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

@Autowired
private ApplicationContext context;

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

更新:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

输出寄存器数据路径在6502中如何工作?

如何使 eval 寄存器整数(例如 05 和 04)有效?(Python)

如何部分初始化寄存器向量(例如,基础捆绑类型的某些字段)

通过预定义的静态地址访问寄存器是C ++中未定义的行为吗?

CUDA:通过点积示例了解循环中寄存器文件中变量的行为

当结果对于寄存器来说很大时,进位和溢出标志的行为如何

两个程序计数器寄存器在6502中如何工作?

通过引用传递寄存器变量

在 AVR MCU 上,状态寄存器中的 S 标志是如何工作的?

在沃伦的抽象机中,如果参数之一是寄存器,绑定如何工作?

如何使用python通过LLDB读写寄存器?

汇编程序如何处理在2个寄存器中分隔的值(例如EDX:EAX)?

创建cdecl函数时如何保留寄存器的状态?

如何打印/检查浮点寄存器?

如何选择CMOS寄存器?

如何读写IMCR寄存器?

如何从寄存器输入多行命令?

如何使用vim寄存器?

如何交换寄存器的某些位

如何分配存储寄存器的名称?

Spring:如何在Spring Boot中动态创建类似的bean?

寄存器分配---如何利用和溢出调用者保存的寄存器

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量

使用方法动态创建Spring Bean

如何通过在Spring控制器中发布表单来获取动态值

尝试通过cr0寄存器禁用分页

NASM:通过寄存器在内存之间移动

为什么通过寄存器调用子例程?

通过结构访问ARM外设寄存器