我想了解@Bean注释的bean注册的编程等价物是什么
假设我有一堂这样的课:
@Configuration
public class SimpleConfiguration {
@Bean
public BigDecimal aDecimal( String example ) {
return new BigDecimal( example );
}
}
这是我认为这里发生的事情:
- 不知何故,spring 将此方法注册为名为 bean 的工厂 BigDecimal 类型的“aDecimal”,依赖于 type 的 bean 字符串
- 在某些时候,将使用正确的 bean 调用此方法,如下所示 参数和结果将是关联到的实例 “aDecimal”bean。
如果我想对这样的事情做同样的事情:
@Configuration
public class DynamicConfiguration {
public void registerDefinition() {
/* i know it can't be like this but i hope it's clear what i mean */
register( "aDecimal", (example) -> aDecimal( example ) );
}
public BigDecimal aDecimal( String example ) {
/* this could be any kind of complex bean creation method */
return new BigDecimal( example );
}
}
实现这一结果的正确方法是什么?
我已经对此进行了一些研究,例如我发现了
How do I create beans programmatically in Spring Boot?
但是这种注册好像没有注解那么强大,我们用spring实例化bean吧,我希望通过提供的方法来实例化bean
How to programmatically create bean definition with injected properties?
并且缺少调用带有注入(inject) bean 参数的方法的能力。
我想这样做的原因是,我有一些配置类,它们基于配置文件,包含许多具有不同限定符的相同类型的 bean。 现在每次扩展配置文件时,我都需要添加新的bean和配置(其中许多是spring SessionFactories和SpringIntegration流,所以我需要这些东西是spring bean)
最佳答案
您需要考虑使用IntegrationFlowContext
:
@Autowired
private IntegrationFlowContext integrationFlowContext;
...
IntegrationFlow myFlow = f -> ...;
BeanFactoryHandler additionalBean = new BeanFactoryHandler();
IntegrationFlowRegistration flowRegistration =
this.integrationFlowContext.registration(myFlow)
.addBean(additionalBean)
.register();
它为您提供了在运行时注册其他 bean 的钩子(Hook),而不仅仅是 IntegrationFlow
结构。
关于spring - 程序化 Bean 注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569255/