java - 具有继承性的 Spring @Autowire

标签 java spring inheritance autowired

我是 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>

并修正你的类(class):

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

关于java - 具有继承性的 Spring @Autowire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24175664/

相关文章:

java - Spring + GWT 项目 - 对每个用户操作执行处理程序

java - AlertDialog - 试图理解这种语法

java - 从 unix 设备读取数据

java - 标准 API : finding entities in a tree with inherited user permissions

java - 如何为 Spring 限定符实现 OR 逻辑?

c++ - 试图在C++中的子类中调用父类的 protected 函数

python - 具有抽象方法和属性的继承

java - Vaadin Layout - 如何让面板展开以填满大部分屏幕

Java 继承和访问修饰符

java - Spring 的带注释的 IOC 对于 Guice 人来说是令人困惑的。帮助启发我