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

Provide single @Bean that can be used to inject in multiple interfaces

考虑以下代码

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 方法与 return 相同实例,这样我就可以为 Iface1Iface2.

的客户端使用相同的实例

当前的问题是 spring 没有 运行 第二个 @Bean 因为没有 @Bean 类型 A.class - 创建的 bean 是被视为 Iface1,即使它是 A.

类型

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

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

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

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

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

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

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

除了其他人已经回答的内容之外,我还想涵盖涉及 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();
}

但不要这样使用,会导致双重代理或"No unique bean of type"错误等细微错误。更喜欢建议。