의존객체 자동 주입이란 ?

  • 스프링 설정 파일에서 의존객체를 주입할때 <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 속성 지원 하지 않음

 

+ Recent posts