Java Spring@Autowire与继承

Java Spring@Autowire与继承,java,spring,inheritance,autowired,Java,Spring,Inheritance,Autowired,我是春天的新手,需要你的全力帮助。我遇到了“预期的单一匹配bean,但发现了两个”异常。我一直在寻找解决方案,我想我已经理解了解决方案。大多数解决方案建议使用@Qualifier来解决此异常。然而,我认为这不会解决我的问题。下面是我的类层次结构: abstract class A{ @Autowired Client client; protected void doSomething(){ /* ....s

我是春天的新手,需要你的全力帮助。我遇到了“预期的单一匹配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>
此外,如果您想了解更多信息,请检查以下答案:


如果您对这些bean使用XML配置,为什么还要使用
@Autowired
?只需直接指定
属性
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 * ........./
}