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;

cs