2010-04-23 52 views
15

我有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,但发现2:A,B,moveModeleMarshaller]

我真的不能让我为什么有这个消息&如何解决,甚至阅读春天documentatio后ñ。

在此先感谢。

+0

我也得到了同样的问题,但不能找到合适的解决方案请帮助我...谢谢 – 2012-05-30 05:48:00

回答

4

您正在尝试(别处)自动装入类型为A的bean。例如:

@Autowired 
private A beanA; 

但是你有2个符合这个的豆。

您可以通过使用@Resource并指定解决此其准确豆:

@Resource("b") 
private A beanA; 

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

14

你应该用@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); 
    } 

您还必须在自动装配Spring bean的类型A的实例上使用@Qualifier批注。

事情是这样的:

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多于一个,就必须指定哪一个或使用@Primary标记其中之一。如果解决了上述两个行,我们有两个豆同一类定义了两种豆,同一类

<bean id="a" class="com.package.MyClass"/> 
<bean id="b" class="com.package.MyClass"/> 

+1

个人观点 - 我更喜欢'@ Resource'的简单案例。 – Bozho 2010-04-25 21:47:45

+0

这只是小细节,但我更喜欢在所有情况下使用@Autowired或新的@Inject(JSR-330)注释。 @Resource和@Inject的一个可能的缺点是你没有在classpath中使用它们,因为它不是Spring的一部分。 – Espen 2010-04-26 08:44:21

2

一般来说,你会得到这个错误。

当你试图通过定义一个bean ID自动装配这个类中的任何其他归类,你会得到这种类型的错误

有两种解决方法

第一种方法

  1. 使用预选赛init 这样的

    @Autowired 
    @Qualifier("a") 
    MyClass a; 
    
    @Autowired 
    @Qualifier("b") 
    MyClass b; 
    

第二种方法

使用JSR250 API(它的一个jar文件,你可以把你的类路径

那就不要autowriring像下面

@Resource("a") 
MyClass a 

@Resource("b") 
MyClass a