본문 바로가기

spring

의존성 주입 어노테이션 - @Autowired

@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