[英]Spring @Autowire with Inheritance
我是 Spring 的新手,希望得到您的所有幫助。 我遇到了“預期的單個匹配 bean,但發現兩個”異常。 我已經搜索了解決方案並認為已經理解了解決方案。 大多數解決方案建議使用@Qualifier 來解決此異常。 但是我認為它不會解決我的問題。 下面是我的類層次結構:
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 配置文件是
<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()
方法將不知道它。
任何想法/建議/解決方案都會有所幫助。
提前致謝 :)
@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 * ........./
}
另外,如果您想了解更多信息,請在此處查看此答案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.