Spring/Study
스프링(Spring) 의존객체 선택
DevMoomin
2020. 4. 12. 20:02
(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)
@Qualifier
동일한 객체가 2개 이상인 경우, 스프링 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 Exception을 발생시키는데, @Qualifier 어노테이션을 통해 주입할 객체를 명시함으로써 해결할 수 있다. (변수 이름과 Bean의 ID가 같은 경우 @Qualifier 어노테이션이 없어도 에러가 발생하지 않지만 추천하는 방식은 아니다.)
appCtx.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean id="wordDao" class="com.word.dao.WordDao" >
<qualifier value="usedDao"/>
</bean>
<bean id="wordDao2" class="com.word.dao.WordDao" />
<bean id="wordDao3" class="com.word.dao.WordDao" />
</beans>
|
cs |
WordRegisterService.java
@Autowired
@Qualifier("usedDao")
private WordDao wordDao;
|
cs |
의존객체 자동 주입 체크
자동 주입할 객체가 없는 경우 Exception이 발생하는데, required=false 속성을 통해 자동 주입할 객체가 없는 경우에는 주입하지 않도록 함으로써 Exception을 방지할 수 있다.
WordRegisterService.java
@Autowired(required=false)
private WordDao wordDao;
|
cs |
@Inject
@Autowired처럼 의존객체를 자동으로 주입을 할 수 있지만, required 속성을 지원하지 않는다. @Qualifier 대신 @Named 어노테이션을 사용한다. (@Inject 보다 @Autowired를 더 많이 사용)
appCtx.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean id="wordDao1" class="com.word.dao.WordDao" />
<bean id="wordDao2" class="com.word.dao.WordDao" />
</beans>
|
cs |
WordRegisterService.java
@Inject
@Named(value="wordDao1")
private WordDao wordDao;
|