출처: http://november11tech.tistory.com/88 [Mr.november11] @Autowired 어노테이션을 이용한 자동 설정 :: 사월은 봄이다.

@Autowired 어노테이션은 의존 관계를 자동으로 설정할 때 사용되며 타입을 이용해 의존하는 객체를 삽입해 준다.


@Autowired 어노테이션은 생성자, 필드, 메서드의 세 곳에 적용이 가능하다.



예 ) 프로퍼티 설정 메서드에 적용


public class MonitorView implements Viewr{

 private DisplayStrategy displayStrategy ;


 @Autowired

 public void setDisplayStrategy(DisplayStrategy displayStrategy ) {

  this.displayStrategy = displayStrategy ;

 }

}


 



@Autowired 어노테이션은 타입을 이용한 프로퍼티 자동 설정 기능을 제공한다. 따라서,

위 코드는 displayStrategy 프로퍼티에 DisplayStrategy 타입의 빈 객체를 전달한다.



@Autowired 어노테이션은 프로퍼티 설정 메서드 뿐 아니라 일반 메서드에서도 적용이 가능하다.


 


public class HomeContrloller {

 private AlarmDevice alarmDevice ;

 private Viwer viewer ;


 @Autowired

 public void prepare( AlarmDevice alarmDevice , Viwer  viwer ){

 this.alarmDevice = alarmDevice ;

 this.viwer = viwer ;

 }

}


 


위 경우 스프링은 HomeController 객체를 생성할 때 prepare()에 AlarmDevice 타입의 빈 객체와 Viwer 타입의 빈 객체를 전달한다.



또한 멤버 필드에 직접 적용해도 된다.


@Autowired

private DisplayStrategy displayStrategy ;



@Autowired 어노테이션을 배열에 적용하면 해당 타입의 모든 빈 객체를 배열로 전달 받는다.


 



1) @Autowired 어노테이션 적용 프로퍼티의 필수 여부 지정

@Autowired 어노테이션은 타입을 이용해 자동적으로 프로퍼티 값을 설정하므로 해당 타입의 빈 객체가 존재하지 않거나 또는

빈 객체가 두 개 이상 존재할 경우 @Autowired 어노테이션이 적용된 빈 객체를 생성할 때 예외를 발생시키게 된다.


하지만 @Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우도 있는데, 이런 경우

@Autowired 어노테이션에 requred 속성의 값을 false로 지정해 주면된다.



public class MonitorView implements Viewr{

 private DisplayStrategy displayStrategy ;


 @Autowired(reqired=false)

 public void setDisplayStrategy(DisplayStrategy displayStrategy ) {

  this.displayStrategy = displayStrategy ;

 }

}


required 속성의 값을 false로 지정할 겨우, 해당 타입의 빈 객체가 존재하지 않더라도 예외를 발생하지 않는다.


 


 


2) @Qualifier 어노테이션을 이용한 자동 설정 제한

@Autowired는 타입을 기반으로 하므로 자동 설정할 타입이 두 개 이상 존재할 경우 예외를 발생시킨다.

이런 경우 @Qualifier 어노테이션을 이용해 동일한 타입의 빈 객체들 중에서 특정 빈을 사용하도록 할 수 있다.


@Qualifier 어노테이션은 @Autowired 어노테이션과 함께 사용된다.

@Qualifier 어노테이션은 자동 연결될 빈 객체의 수식어를 값으로 갖는다.



public class HomeController{

 @Autowired

 @Qualifier("main")

 private Recorder recorder ;

 ...

}



위 코드는 recorder 멤버 필드에 Recorder 타입의 빈 객체를 자동 연결하는데, 수식어가 "main"인 빈 객체를 연결한다는 것을 의민한다.

빈 객체의 수식어는 설정 파일에서 <qualifier> 태그를 이용해 설정할 수 있다.



<bean id ="recorder" class="madvirus.spring.chap04.homecontrol.Recorder">

 <qualifier value = "main" />

</bean>



<qualifier> 태그의 value 속성의 값을 @qualifier 어노테이션의 값으로 사용하게 된다.


 



생성자나 메서드가 2개 이상의 파라미터를 갖는 경우 @Qualifier 어노테이션을 각 파라미터에 적용함으로써 각 파라미터에 전달되는 빈 객체를 한정할 수도 있다,


@Autowired

public void prepare(AlarmDevice alarmDevice , @Qualifier("center") Viewer viewer){

 this.alarmDevice = alarmDevice ;

 this.viewer = viewer ;

}


 


 

+ Recent posts