Spring 5 基于状态的豆类注入 - 可能吗?



我试图在Spring 5.0中找到一些'控制器'(不是@Controller(,它负责解决在Spring中注入的实现实例。我想提供我自己的控制器实现(或扩展它(,以便我可以为基于状态的 Bean 解析添加自己的逻辑。

例如,给定一些接口 Foo,实现 FooImpl1 和 FooImpl2,以及一些状态 Baz。

然后,当 Baz = 1 时,我想进入我自己的逻辑,决定提供 FooImpl1 而不是 FooImpl2 作为所需的 Foo 实现注入。

春天今天这样做,逻辑似乎是:

  • 鉴于需要注入类 X,请找到其实现
  • 如果只找到 X 中的一个,请使用
  • 如果找到多个 X,请使用 Primary
  • 如果找到多个 X 且没有主,则查找限定符
  • 如果找到多个 X,并且没有主限定符,请尝试按名称将 X 与属性或参数 X 匹配(即:如果参数或属性是 x 而不是 y,则不要注入 Y(。

我想做的是在上述逻辑中的某个时刻,根据我自己的逻辑和状态调用我自己对要注入的所需实现的消除歧义/解析。

因此,在我深入研究 Spring 以找到实现该逻辑的位置之前,我希望发现它是在我可以扩展的某个控制器/服务中实现的,最好还是由一些配置支持......

你可以实现自己的@Configuration,返回一个 Spring @Bean:

@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();
}    
}
}

另请阅读有关全@Configuration与"精简"@Bean模式的段落。最后一段指出:

在常见情况下,@Bean方法将在@Configuration类中声明,确保始终使用"完整"模式,从而将跨方法引用重定向到容器的生命周期管理。这可以防止通过常规 Java 调用意外调用相同的@Bean方法,这有助于减少在"精简"模式下操作时难以追踪的细微错误。

似乎我正在寻找的是接口BeanFactory,很可能是可配置BeanFactory。还有一些事情需要偏离轨道,但这绝对是正确的方向。

对于那些立即对我在说什么感到好奇的人......请参阅 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/ConfigurableBeanFactory.html

最新更新