@Autowired는 생성자나 메소드, 멤버변수 위에 모두 사용할 수 있다. 어디에 사용하든 결과는 같지만, 대부분 멤버변수 위에 선언하여 사용한다.
스프링 컨테이너는 멤버변수 위에 붙은 @Autowired를 확인하는 순간 해당 변수의 타입을 체크한다. 그리고 그 타입의 객체가 메모리에 존재하는지를 확인한 후에, 그 객체를 변수에 주입한다.
만약 @Autowired가 붙은 객체가 메모리에 없다면 컨테이너가 NoSuchBeanDefinitionException을 발생시킨다.
@Autowired의 기능을 테스트하기 위해서 LgTv 클래스에 다음과 같이 멤버변수를 추가하고 의존관계를 설정한다.
package polymorphism;
@Component("tv")
public class LgTv implements Tv {
@Autowired
private Speaker speaker;
public LgTv() {
System.out.println("===> LgTv 객체 생성");
}
public void powerOn() {
System.out.println("===> LgTv---전원 켠다.");
}
public void powerOff() {
System.out.println("===> LgTv---전원 끈다.");
}
public void VolumeUp() {
speaker.volumeUp();
}
public void VolumeDown() {
speaker.volumeDown();
}
}
위 처럼 설정하면 LgTV 클래스에는 의존성 주입에 사용했던 Setter 메소드나 생성자는 필요없다. 그리고 스프링 설정 파일 역시 <cotext:component-scan/> 외에는 아무런 설정도 하지 않는다. 그러나 SonySpeaker 객체가 메모리에 없으면 에러가 발생하므로 반드시 SonySpeaker객체가 메모리에 생성되어 있어야 한다. SonySpeaker 객체를 생성하려면 다음과 같이 두 가지 방법 중 하나를 처리해야 한다.
XML 설정
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
Annotation 설정
@Component("sony")
public class SonySpeaker implements Speaker {
public SonySpeaker() {
System.out.println("===> SonySpeaker 객체 생성");
}
}
어떤 방법을 사용하든 상관없다. 의존성 주입 대상이 되는 SonySpeaker객체가 메모리에 생성만 되면 @Autowired에 의해서 컨테이너가 SonySpeaker 객체를 speaker 변수에 자동으로 할당하기 때문이다.
[참조 - 스프링 퀵 스타트]
'spring' 카테고리의 다른 글
스프링 컨테이너의 관계 (0) | 2020.12.20 |
---|---|
어노테이션 - @Component (0) | 2020.12.13 |
Command 객체 (0) | 2020.11.07 |
Spring MVC 구조 - (하) (0) | 2020.10.20 |
IOC(Inversion of Control)컨테이너 - 서블릿 컨테이너 (0) | 2020.10.03 |