Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring5基于状态的Bean注入-可能吗?_Spring_Spring Boot - Fatal编程技术网

Spring5基于状态的Bean注入-可能吗?

Spring5基于状态的Bean注入-可能吗?,spring,spring-boot,Spring,Spring Boot,我试图在Spring5.0中找到一些“控制器”(而不是@controller),负责解决在Spring中注入哪个实现实例。我想提供该控制器的我自己的实现(或扩展它),以便我可以为基于状态的bean解析添加我自己的逻辑 例如,给定一些接口Foo,实现FooImpl1和FooImpl2,以及一些状态Baz 然后,当Baz=1时,我想进入我自己的逻辑,决定为所需的Foo实现注入提供FooImpl1而不是FooImpl2 Spring今天做到了这一点,其逻辑似乎是: 考虑到注入类X的需要,找到它的实现

我试图在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而不是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();
        }    
    }
}