빈설정에서 annotation 과 component-scan의 base-package를 선언해주고 autowire="byType"(선언을 안할경우 default byType) 으로 설정하면 인스턴스명으로 특정 클래스에 Injection 을 하지 않고 타입을 찾아서 하게 된다.
예를 들어
CustomerManager 가 CustomerService에 대해 Dependency를 가지고 있을경우 다음과 같이 선언했다고 해보자.
CustomerManager.java
public class CustomerManager {
@Autowired
private CustomerService customerService;
.....
}
CustomerService.java
@Component
public class CustomerService {
}
xml 파일 설정
<bean name="customerManager"
class="com.bizuma.test.customer.CustomerManager"
autowire="byType" />
<bean name="customerXX" class="com.bizuma.test.customer. CustomerService" />
클라이언트 테스트클래스를 하나 만들어서 해당 빈을 로드하게 되면 문제없이 Injjection이 성공하게 된다. 하지만 CustomerManager 의 CustomerService인스턴스인 customerService인스턴스 명을 customerServices 라고 선언할경우 다음과 같은 오류가 발생한다.
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.bizuma.test.customer. CustomerService] is defined: expected single matching bean but found 2: customerServices, customerXX
문제는 bean 설정파일에서 bean name을 customerXX로 해서 문제가 발생하는 것이 아니라 CustomerService의 인스터스명끝에 "s"를 하나 더 붙여서 나는 것이다.
내가 알지 못하는 무언가가 있는것인가 아니면 byType이어도 인스턴스 명명규칙은 지켜줘야 하는것인가.