代码之家  ›  专栏  ›  技术社区  ›  Izbassar Tolegen

如何用构造函数注入限定bean

  •  2
  • Izbassar Tolegen  · 技术社区  · 6 年前

    我有一个接口,在两个地方定义如下:

    @Configuration
    public class AppContext {
        @Bean
        public SomeInterface usageOne() {
            return new SameImpl();
        }
    
        @Bean
        public SomeInterface usageTwo() {
            return new SameImpl(someOtherConfig);
        }
    
        @Bean
        public Client clientOne(SomeInterface usageOne) {
            return new Client(usageOne);
        }
    
        @Bean
        public OtherClient clientTwo(SomeInterface usageTwo) {
            return new OtherClient(usageTwo);
        }
    }
    

    我的客户机实现类没有任何注释,只需要构造函数。在这种情况下,如何限定正确的接口实现用法?我不想用 @Primary 在我的例子中,将其中一种用法命名为primary(它们在某种意义上是相等的)在语义上是不正确的。我需要用相同的实现类传递相同的接口,但针对受尊重客户机的特定用例配置不同。我在想,命名用于将实现注入bean创建方法的参数就足够了,但是Spring抱怨: required a single bean, but 2 were found . 我不明白该如何使用 @Qualifier 注释。

    我运行的是SpringBoot2.0.4.release,并尊重在单独配置类中创建的bean和客户机,因此我不能只调用 usageTwo() 创建时的方法 OtherClient 像这样: new OtherClient(usageTwo()); 因为这个方法在客户机配置类中不可用。

    1 回复  |  直到 6 年前
        1
  •  2
  •   dpr    6 年前

    正如@chrylis在注释中提到的,您可以简单地添加 @Qualifier 注释到 @Bean 方法如下:

    @Bean
    public Client clientOne(@Qualifier("usageOne") SomeInterface usageOne) {
        return new Client(usageOne);
    }
    
    @Bean
    public OtherClient clientTwo(@Qualifier("usageTwo") SomeInterface usageTwo) {
        return new OtherClient(usageTwo);
    }
    

    指定为的值 限定词 注释是各自bean的名称。这是相应的 @豆 方法或注释的值(如果这样使用) @Bean("usageThree") .