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