簡體   English   中英

Spring @Autowire 繼承

[英]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 * ........./
}

另外,如果您想了解更多信息,請在此處查看此答案:

抽象類上的 Spring Autowire 注釋:未定義唯一的 bean

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM