티스토리 뷰

Programming/Spring

스프링 의존객체 선택

감성적인 개발자 2022. 3. 17. 23:06

@Autowired를 이용하면 컨테이너 상에서 객체 Type이 일치하는 의존객체를 찾아 주입해준다. 그런데 컨테이너 상에 같은 타입의 Bean이 복수개 존재하게 되면, 스프링이 주입대상 객체를 판단하지 못해 Exception이 발생한다.

 

같은 타입의 Bean이 여러개 존재하는 상황에서, @Autowired를 이용하기 위해선 @Qualifier를 통해 Bean을 구분해주면 된다. 

 

@Qualifier 사용 전

ApplicationContext.xml

<bean id="injectionBean1" class="scope.ex.InjectionBean /">
<bean id="injectionBean2" class="scope.ex.InjectionBean" />
<bean id="injectionBean3" class="scope.ex.InjectionBean" />

<bean id="dependencyBean" class="scope.ex.DependencyBean" />

DependencyBean.java

public class DependencyBean {
	@Autowired
	private InjectionBean injectionBean; 
}

 

콘솔에러 일부

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dependencyBean': Injection of autowired dependencies failed;
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [scope.ex.InjectionBean] is defined: expected single matching bean but found 3: injectionBean1,injectionBean2,injectionBean3

같은 타입을 가지는 Bean을 세개 생성해준 뒤 @Autowired를 사용한 자동주입을 시도하니 에러가 발생했다. 에러 메세지를 읽어보면 Autowired를 하는데 매칭되는 bean이 3개라서 주입할 객체를 판단하지 못하였다고한다. 컨테이너와 Java코드에 Qualifier를 추가해 해당 에러를 해결할 수 있다.

 

 

@Qualifier 사용

ApplicationContext.xml

<bean id="injectionBean1" class="scope.ex.InjectionBean">
    <qualifier value="injectionBean1"/>
</bean>
<bean id="injectionBean2" class="scope.ex.InjectionBean">
    <qualifier value="injectionBean2"/>
</bean>
<bean id="injectionBean3" class="scope.ex.InjectionBean">
    <qualifier value="injectionBean3"/>
</bean>

DependencyBean.java

public class DependencyBean {
	
	@Autowired
	@Qualifier("injectionBean1")
    	//@Qualifier("injectionBean2")
    	//@Qualifier("injectionBean3")
	private InjectionBean injectionBean;
}

컨테이너 상에서 Bean마다 Qualifier를 명시해주면 Java파일에서 @Qualifier 어노테이션으로 주입할 객체를 지정해줄 수 있다. 참고로 @Qualifier 어노테이션은 생성자에 지정 불가하다.

 

 

@Qualifier 없이 동작

컨테이너에 동일한 타입의 Bean이 여러개 존재해도 실행되는 경우가 있는데, Java 변수명이 컨테이너의 Bean id와 동일할 때는 스프링이 의존객체를 선택할 수 있다.

 

ApplicationContext.xml

<bean id="injectionBean1" class="scope.ex.InjectionBean /">
<bean id="injectionBean2" class="scope.ex.InjectionBean" />
<bean id="injectionBean3" class="scope.ex.InjectionBean" />

<bean id="dependencyBean" class="scope.ex.DependencyBean" />

DependencyBean.java

public class DependencyBean {
	@Autowired
	private InjectionBean injectionBean1; //injectionBean2, injectionBean3
}

변수명을 injectionBean2, injectionBean3로 바꾸어도 정상 동작하는걸 확인할 수 있다. 그러나 이런 방식은 이후 혼동이 올 수 있기 때문에 되도록 지양하는 것이 바람직하다.

 

 

 

출처 : [인프런] 자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함