自动装配的问题和没有独特的bean

mad*_*ada 16 spring

我有2个类(B,C)扩展了A类.

@Service
public class A  extends AbstratClass<Modele>{

    @Autowired
    A(MyClass  br) {
        super(br);
    }


@Service
public class B  extends A{

  @Autowired
  B (MyClass  br) {
     super(br);
  }



@Service
public class C  extends A{

  @Autowired
  C (MyClass  br) {
     super(br);
  }
Run Code Online (Sandbox Code Playgroud)

但我有这样的信息:

没有定义类型为[A]的唯一bean:期望的单个匹配bean但找到2:[A,B,moveModeleMarshaller]

我真的不知道为什么我有这个消息以及如何在阅读Spring文档后解决.

提前致谢.

Esp*_*pen 15

您应该使用@Qualifier注释将类重写为类似的内容.

@Service
@Qualifier("a")
public class A  extends AbstratClass<Modele>{

    @Autowired
    A(MyClass  br) {
        super(br);
    }


@Service
@Qualifier("b")
public class B  extends A{

  @Autowired
  B (MyClass  br) {
     super(br);
  }

@Service
@Qualifier("c")
public class C  extends A{

  @Autowired
  C (MyClass  br) {
     super(br);
  }
Run Code Online (Sandbox Code Playgroud)

您还必须在类型A的实例上使用@Qualifier注释,并将Spring bean自动装入.

像这样的东西:

public class Demo {

    @Autowired
    @Qualifier("a")
    private A a;

    @Autowired
    @Qualifier("b")
    private A a2;

    public void demo(..) {..}
}
Run Code Online (Sandbox Code Playgroud)

如果您不希望在生产代码中使用此Spring配置,则必须使用XML或Java配置编写依赖注入逻辑.

您还可以指定类型A的默认bean,其@Primary注释位于一个扩展类型A的服务类之上.然后,Spring可以自动装配而不指定@Qualifier注释.

由于Spring永远不会尝试猜测要注入哪个bean,因此只要有@Primary多个bean类型,就必须指定哪个bean或者标记其中一个bean.


Boz*_*zho 4

您正在尝试(在其他地方)自动装配类型为 的 bean A。就像是:

@Autowired
private A beanA;
Run Code Online (Sandbox Code Playgroud)

但你有 2 个符合这个条件的 Bean。

您可以通过使用@Resource并指定确切的 bean 来解决此问题:

@Resource("b")
private A beanA;
Run Code Online (Sandbox Code Playgroud)

(其中“b”是注入的 bean 的名称)或使用注释@Qualifier