티스토리 뷰
@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.) - 신입 프로그래머를 위한 강좌
'Programming > Spring' 카테고리의 다른 글
스프링 컨테이너와 Bean객체의 생명주기 (0) | 2022.03.19 |
---|---|
스프링 DI Annotation - @Autowired, @Inject 정리 (0) | 2022.03.18 |
스프링 어노테이션을 활용한 의존객체 자동주입 (0) | 2022.03.12 |
스프링 Bean의 범위 - 싱글톤과 프로토타입 (0) | 2022.03.12 |
스프링 설정파일 분리 (0) | 2022.03.12 |
- Total
- Today
- Yesterday
- 넥사크로
- SQL
- JVM
- 이클립스
- 프로그래머스
- C++
- 인턴
- svn
- CS
- 스프링부트
- 부트스트랩
- Thymeleaf
- 개발용어
- 스프링
- Open API
- JSP
- Java
- 네트워크
- 국비교육
- 백준
- 환경설정
- 데이터베이스
- C
- 오라클
- CSS
- HeidiSQL
- 오류
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |