2014-06-12 125 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