저는 봄에 익숙하지 않고 여러분의 모든 도움을 원했습니다. "예상 단일 일치 bean을 실행했지만 두 가지를 발견했습니다"예외입니다. 나는 해결책을 찾고 그 해결책을 이해했다고 생각한다. 대부분의 솔루션은 @Qualifier를 사용하여이 예외를 해결할 것을 제안합니다. 그러나 나는 그것이 내 문제를 해결할 것이라고 생각하지 않습니다.Spring @Autowire with Inheritance
이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의 confirugration 파일이
<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는 매개 변수로 .xml에서 bean 이름을 지정해야하기 때문에 @Qualifier를 사용할 수 없다고 생각합니다. 그러나 'client'속성은 공통이므로 하나의 bean 이름 만 사용할 수 없습니다.
주위를 둘러 볼 방법이 있는지 설명 할 수있는 사람이 있습니까? doSomething()
메서드를 복제하면 상속의 목적이 모두 상실되며 클래스간에 중복 코드가 생성됩니다. 컴파일시에 doSomething()
메소드에 알려지지 않을 것이므로 서브 클래스에 client
속성을 가질 수 없습니다.
아이디어/제안/솔루션이 도움이 될 것입니다. 사전 :
: 더 이해하려면, 여기이 답변을 확인하시기 바랍니다 또한
을 이 빈들에 XML 설정을 사용하고 있다면 @ Autowired를 사용하는 이유는 무엇인가? 단지 '속성'을 직접 지정하십시오. –