2014-06-12 91 views
3

我是Spring的新手,希望得到您的一切帮助。我遇到了“期望单匹配bean但发现两个”异常。我已经搜索了解决方案,并认为已经理解了解决方案。大多数解决方案都建议使用@Qualifier来解决此异常。但我认为这不会解决我的问题。下面是我的类层次结构:Spring @Autowire继承

abstract class A{ 

    @Autowired 
    Client client;      

    protected void doSomething(){ 
     /* ....some code .... */ 
     client.someStuff(); 
     /* ....some code .... */ 
    } 

    /* ..... few abstract methods ......... */ 
} 

class B extends A{ 
    public void action(){ doSomething() } 
} 

class C extends A{ 
    public void action(){ doSomething() } 
} 

我的.xml文件confirugration是

<bean id="authClientA" class="com.xyz.Client"> 
     <property name="auth" value="abc"> 
    </bean> 


    <bean id="authClientB" class="com.xyz.Client"> 
     <property name="auth" value="xyz"> 
    </bean> 

    <bean id="beanA" class="ClassA"> 
     <property name="client" ref="authClientA"> 
    </bean> 

    <bean id="beanB" class="ClassB"> 
     <property name="auth" ref="authClientB"> 
    </bean> 

所以基本上,我有有,这将是两者共同的子类中的方法的抽象类。此方法使用客户端引用,但在运行时将使用不同的对象。 doSomething()在子类中不被覆盖。

所以当我尝试运行这段代码时,它给了我客户端引用的例外。我不认为我可以使用@Qualifier,因为@Qualifier需要将.xml中的bean名称指定为参数,但由于'client'属性很常见,所以我不能只使用一个bean名称。

有人可以帮助解释是否有办法解决。复制doSomething()方法会破坏继承的整个目的,并会导致跨类的代码重复。我不能在子类中拥有client属性,因为它在编译时将变为doSomething()方法。

任何想法/建议/解决方案将有所帮助。

感谢提前:)

+2

如果你对这些bean使用XML配置,为什么即使使用'@ Autowired'?只需直接指定“属性”即可。 –

回答

0

@Qualifier是选项,你可能不能够使用它。

修改您的XML:

<bean id="authClientA" class="com.xyz.Client"> 
    <property name="auth" value="abc"> 
    <qualifier value="clientA" /> 
</bean> 


<bean id="authClientB" class="com.xyz.Client"> 
    <property name="auth" value="xyz"> 
    <qualifier value="clientB" /> 
</bean> 

<bean id="beanA" class="ClassA"> 
    <property name="client" ref="authClientA"> 
</bean> 

<bean id="beanB" class="ClassB"> 
    <property name="auth" ref="authClientB"> 
</bean> 

和固定类:

abstract class A{ 

     @Qualifier("clientA") 
     Client clientA;      

     @Qualifier("clientB") 
     Client clientB;  

     protected void doSomething(){ 
       /* ....some code .... */ 
       client.someStuff(); /* HERE YOU NEED SOME LOGIC TO INVOKCE THE CORRECT OBJECT METHOD */ 
       /* ....some code .... */ 
     } 

     /* ..... few abstract methods * ........./ 
} 

另外,如果你想了解更多,请查看这个答案在这里:

Spring Autowire Annotation on Abstract class: No unique bean is defined