自动装配问题&没有独特的豆子

时间:2010-04-23 15:03:54

标签: 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);
  }

但我有这样的信息:

  

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

我真的不知道为什么我有这个消息&amp;阅读Spring文档后如何解决。

提前致谢。

3 个答案:

答案 0 :(得分: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);
  }

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

这样的事情:

public class Demo {

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

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

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

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

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

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

答案 1 :(得分:4)

您正在尝试(在其他地方)自动装配A类型的bean。类似的东西:

@Autowired
private A beanA;

但你有两个符合这个要求的豆子。

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

@Resource("b")
private A beanA;

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

答案 2 :(得分:2)

通常,在定义两个具有相同类

的bean时会出现此错误
<bean id="a" class="com.package.MyClass"/>
<bean id="b" class="com.package.MyClass"/>

如果你解决上面两行,我们有两个具有相同类的bean。

当您尝试在任何其他类别中自动装配此类时,您将收到此类错误

你有两个解决方案

第一种方法

  1. 通过定义bean id init来使用限定符 像这样

    @Autowired
    @Qualifier("a")
    MyClass a;
    
    @Autowired
    @Qualifier("b")
    MyClass b;
    
  2. 第二种方法

    使用JSR250 api(它可以放入类路径的jar文件

    然后执行如下所示的自动装配

    @Resource("a")
    MyClass a
    
    @Resource("b")
    MyClass a