Spring 实现多个接口的 Bean

Spring Bean implementing multiple interfaces

我有一个实现两个接口的 bean。准系统代码如下:

interface InterfaceA {
  ...
}

interface InterfaceB {
  ...
}

public class ClassC implements InterfaceA, InterfaceB {
  ...
}

在我的 AppConfig 中,我指定了以下内容:

@Bean(name = "InterfaceA")
public InterfaceA interfaceA() {
    return new ClassC();
}

@Bean(name = "InterfaceB")
public InterfaceB interfaceB() {
    return new ClassC();
}

我是这样用的:

public class MyClass {

    @Inject
    private final InterfaceA a;

    public MyClass(@Named("InterfaceA") InterfaceA a) {
        this.a = a;
    }
     ...
}

然而,Spring 抱怨说:

No qualifying bean of type [com.example.InterfaceA] is defined: expected single matching bean but found 2: InterfaceA, InterfaceB

针对 EJB here 提出并回答了类似的问题,但我找不到 Spring beans 的任何内容。有人知道原因吗?

解决方法是引入一个扩展 InterfaceAInterfaceB 的新接口,然后让 ClassC 实现它。但是,由于框架的限制,我不愿意改变我的设计。

Spring是对的...当你写

@Bean(name = "InterfaceA")
public InterfaceA interfaceA() {
    return new ClassC();
}

@Bean(name = "InterfaceB")
public InterfaceB interfaceB() {
    return new ClassC();
}

Spring 创建 ClassC 个对象,一个名为 InterfaceA,另一个 InterfaceB,都实现了 InterfaceA 和 InterfaceB。

然后当你写:

@Inject
private final InterfaceA a;

你要求Spring找到一个bean实现InterfaceA,但是如上所述有2个所以错误。

您可以只创建一个 ClassC 类型的对象,或者使用 @Qualifier@Named 注释:

@Inject
@Named("InterfaceA")
private final InterfaceA a;

这样,您明确要求 Spring 找到名为 InterfaceA 的 bean,希望它现在是唯一的。

感谢您的精彩提问。

就我而言,我创建了一个同时扩展 A 和 B 的接口:

public interface InterfaceC extends InterfaceA, InterfaceB {}

...而common实现实现统一接口:

public class ClassC implements InterfaceC {
  //...
}

这个统一接口允许创建单个 bean:

@Bean
public InterfaceC implementationForAandB() {
    return new ClassC();
}

Spring 框架然后能够将通用实现注入或自动装配到以主要接口表示的依赖项:

public class MyClass {

    @Inject
    private final InterfaceA a;

    @Inject
    private final InterfaceB b;

    public MyClass(InterfaceA a, InterfaceB b) {
        //...
    }

}