提供可用于注入多个接口的单个​​@Bean

时间:2017-11-28 10:12:09

标签: java spring javabeans autowired

考虑以下代码

public interface Iface1 { }
public interface Iface2 { }

public class A implements Iface1, Iface2 {

}

@Configuration
public class AutoConfig {

  @Bean
  Iface1 provideIface1Impl() {
      return new A();  // instance no 1234
  }

  @Bean
  @ConditionalOnBean(A.class)
  @Autowired
  Iface2 provideIface2Impl(A aImpl) {
    return aImpl;
  }
}

我希望第二个@Bean方法与第一个(1234)中的实例一起自动装配,并且我希望第二个@Bean方法返回相同的实例,以便我可以为Iface1Iface2的客户使用相同的实例。

目前的问题是Spring没有运行第二个@Bean,因为@Bean类型没有A.class - 创建的bean甚至被视为Iface1虽然它的类型为A

3 个答案:

答案 0 :(得分:2)

只需定义bean A.当注入IFace1和Iface2时,它们将自动解析为A(如果A是当然唯一的实现)。

@Bean
public A a() {
    return new A();
}

答案 1 :(得分:0)

我认为你应该尝试只定义一个@Bean。它将创建一个单身人士:

@Bean
public A a() {
      return new A();
}

然后在@Qualifier注释中使用此bean的名称:

@Autowired
@Qualifier("a")
private Iface1 iface1;

@Autowired
@Qualifier("a")
private Iface2 iface2;

答案 2 :(得分:0)

除了其他人的回答之外,我还想介绍触及bean依赖的那部分问题。 要为@Bean - 注释方法注入依赖关系,有两种方法:

两者的例子:

@Configuration
public class AppConfig {

    @Bean
    public Foo foo() {
        return new Foo();
    }

    @Bean
    public Bar bar() {
        return new Bar(foo());
    }

    @Bean
    public Baz baz(Foo foo) {
        return new Baz(foo);
    }
}

所以你的provideIface2Impl看起来像这样:

@Bean
Iface2 provideIface2Impl(A aImpl) {
    return aImpl;
}

// or...

@Bean
Iface2 provideIface2Impl() {
    return (Iface2)provideIface1Impl();
}

但是不要这样使用它,它会导致像双重代理这样的微妙错误或者#34;没有类型的独特bean#34;错误等。首选Gorazd建议。