의존객체 자동 주입이란 ?
- 스프링 설정 파일에서 의존객체를 주입할때 <construct-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능
- 구현방법으로 @Autowired, @Resource, @inject 어노테이션을 사용
의존객체 자동 주입을 사용하려면 스프링 설정 파일에 <context:annotation-config /> 추가해줘야함
@Autowired
- 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입
- @Resource 보다 사용할 수 잇는 범위가 넓다
- 사용할 수 있는 위치 : 맴버 변수, setter 메소드, 생성자, 일반 메소드
-스프링 설정 파일 appCtx.xml
<context:annotation-config />
<bean id="wordDao" class="com.word.dao.WordDao" >
</bean>
-WordRegisterServiceUseAutowired.java
@Autowired
private WordDao wordDao;
@Autowired 사용시 주의할점
- @Autowired는 동일한 타입의 빈이 2개 이상일 경우 스프링 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 Exception 발생시킴
- 이를 해결하기 위해 @qualifier 사용
- 단, 동일한 타입의 빈이 여러 개 존재할 경우 기본적으로 참조 변수의 이름과 동일한 빈을 찾아서 주입한다.
- 아래 예시와 같이 동일한 타입을 빈이 3가지 있는 상황에서 그냥 실행시키면 에러가 발생하지만 bean id 중 wordDao 가 있다면 참조 변수의 이름과 동일한 빈이 있어 오류가 발생하지 않는다
- appCtx.xml
<context:annotation-config />
<bean id="wordDao1" 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" />
-WordRegisterServiceUseAutowired.java
@Autowired
@Qualifier("usedDao")
private WordDao wordDao;
- 디폴트 생성자 없이 프로퍼티나 메소드에 @Autowired 사용할 경우 에러가 발생하므로 디폴트 생성자를 꼭 명시해줘야함
public WordRegisterServiceUseAutowired() {
// TODO Auto-generated constructor stub
}
@Autowired
public WordRegisterServiceUseAutowired(WordDao wordDao) {
this.wordDao = wordDao;
}
@Resource
- 주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입
- 사용할 수 있는 위치 : 맴버변수, setter 메소드
<context:annotation-config />
<bean id="wordDao1" 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" />
@Resource(value="wordDao1")
private WordDao wordDao;
@inject
@Autowired와 비슷하게 의존 객체를 자동으로 주입할 수 있음
@Autowired와 차이점이라면 @Autowired일 경우 required 속성을 사용하여 의존 대상 객체가 없을 경우에도 Exception을 피할 수 있지만, @inject의 경우 required 속성 지원 하지 않음