Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
903 views
in Technique[技术] by (71.8m points)

spring - Problem with Autowiring & No unique bean

I have 2 classes (B,C) extends class 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);
  }

But i have this message:

No unique bean of type [A] ] is defined: expected single matching bean but found 2: [A, B, moveModeleMarshaller]

I really cant get why i have this message & how to resolve even after reading Spring documentation.

Thanks in advance.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You should rewrite your class to something like this with the @Qualifier annotation.

@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);
  }

You must also use the @Qualifier annotation on the instance of type A you're autowiring the Spring bean into.

Something like this:

public class Demo {

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

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

    public void demo(..) {..}
}

If you don't like to have this Spring configuration in your production code, you have to write the dependency injection logic with XML or Java configuration instead.

You can also specify a default bean of type A with the @Primary annotation above one of your service classes that extends type A. Then Spring can autowire without specifying the @Qualifier annotation.

Since Spring will never try to guess which bean to inject, you have to specify which one or mark one of them with @Primary as long as its more than one bean of a type.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...