Spring5基于状态的Bean注入-可能吗?
我试图在Spring5.0中找到一些“控制器”(而不是@controller),负责解决在Spring中注入哪个实现实例。我想提供该控制器的我自己的实现(或扩展它),以便我可以为基于状态的bean解析添加我自己的逻辑 例如,给定一些接口Foo,实现FooImpl1和FooImpl2,以及一些状态Baz 然后,当Baz=1时,我想进入我自己的逻辑,决定为所需的Foo实现注入提供FooImpl1而不是FooImpl2 Spring今天做到了这一点,其逻辑似乎是:Spring5基于状态的Bean注入-可能吗?,spring,spring-boot,Spring,Spring Boot,我试图在Spring5.0中找到一些“控制器”(而不是@controller),负责解决在Spring中注入哪个实现实例。我想提供该控制器的我自己的实现(或扩展它),以便我可以为基于状态的bean解析添加我自己的逻辑 例如,给定一些接口Foo,实现FooImpl1和FooImpl2,以及一些状态Baz 然后,当Baz=1时,我想进入我自己的逻辑,决定为所需的Foo实现注入提供FooImpl1而不是FooImpl2 Spring今天做到了这一点,其逻辑似乎是: 考虑到注入类X的需要,找到它的实现
- 考虑到注入类X的需要,找到它的实现
- 如果只找到X中的一个,则使用该选项
- 如果找到多个X,请使用主X
- 如果找到多个X且没有主X,则查找限定符
- 如果找到多个X,并且没有主参数和限定符,则尝试按名称将X与属性或参数X匹配(即:如果参数或属性是X而不是Y,则不注入Y)
因此,在我深入研究Spring以确定该逻辑在何处实现之前,我希望能够发现它是在一些我可以扩展的控制器/服务中实现的,最好是由一些配置支持…您可以实现自己的返回Spring的控制器/服务: 请同时阅读有关的段落。最后一段指出: 在常见场景中,@Bean方法将在@Configuration类中声明,以确保始终使用“完整”模式,并且跨方法引用因此被重定向到容器的生命周期管理。这可以防止通过常规Java调用意外调用相同的@Bean方法,这有助于减少在“lite”模式下操作时难以追踪的细微错误
看来我要找的是BeanFactory接口,很可能是可配置的BeanFactory接口。当然还有一些事情需要解决,但这绝对是正确的方向
对于那些立即好奇我在说什么的人。。。请参见如果您使用
@Bean
方法来提供Bean,那么该方法可以执行它想要决定实例化哪个类的任何操作。但当然,过去决定它的国家必须在那个时候知道。你说的这个状态是什么?谢谢,我认为这是最简单的解决方案,不过出于我的需要,我可能会选择BeanFactory实现。再次感谢你!
@Configuration
public class Config {
private final Baz baz;
@Autowired
Config(Baz baz) {
this.baz = baz
}
@Bean
public Foo getFoo() {
switch (baz) {
case 1:
return new FooImpl1();
default:
return new FooImpl2();
}
}
}