Iyoungman Back-end Developer

스프링 프레임워크 핵심 기술 - @Autowired

2020-05-21

Summary

  • @Autowired 사용과 동작원리에 대해 알아본다.


@Autowired

  • 필요한 의존 객체의 타입에 해당하는 빈을 찾아 주입한다.
  • 선언한 빈을 못 찾으면 애플리케이션 구동 안된다.
boolean required() default true;


사용할 수 있는 위치

1) 생성자

스프링 4.3 부터는 생략 가능

2) 세터

3) 필드


경우의 수

1) 해당 타입의 빈이 없는 경우

  • 구동이 안된다.
  • 굳이 구동시키고 싶다면 required = false.


2) 해당 타입의 빈이 한 개인 경우

  • 구동 된다.


3) 해당 타입의 빈이 여러 개인 경우

public interface AllService {
}

@Service
public class AService implements AllService {
}

@Service
public class BService implements AllService {
}

@Service
public class OtherService {

    //찾을 수 없다.
    @Autowired
    private AllService allService;
}
  • 구동이 안된다.

해결 방법1. @Primary

  • 우선 순위를 정한다.
  • AService 혹은 BService에 선언한다.

해결 방법2. @Qualifier

  • 빈의 이름을 기입한다.
  • 기본적으로 빈의 camelCase가 이름이다.
@Service
public class OtherService {

    @Autowired @Qualifier("aService")
    private AllService allService;
}


동작 원리

  • BeanPostProcessor라는 LifeCycle Interface의 구현체에 의해 동작.


BeanPostProcessor

  • 빈의 인스턴스를 만드는 LifeCycle이 있다.
  • BeanPostProcessor는 빈의 initialization Life Cycle 이전과 이후에 또 다른 부가적인 작업을 할 수 있는 LifeCycle CallBack.


1) @PostConstuct

@Service
public class OtherService implements InitializingBean {

    @Autowired
    private AllService allService;

    @PostConstruct
    public void setUp() {
        //do...
    }
}


2) InitializingBean

@Slf4j
@Service
public class OtherService implements InitializingBean {

    @Autowired
    private AllService allService;

    @Override
    public void afterPropertiesSet() throws Exception {
        //do...
    }
}



AutowiredAnnotationBeanPostProcessor

  • BeanPostProcessor를 상속받고 있다.

1_상속구조


  • 다음은 빈 초기화 LifeCycle 일부이다.

image


  • BeanPostPorcessor는 이중 두가지 메서드를 제공한다.(11, 14)

image


  • BeanPostProcessor의 postProcessBeforeInitialization() LifeCycle에
  • AutowiredAnnotationBeanPostProcessor가 동작해서 @Autowired 라는 Annotation을 찾아 해당 타입의 Bean을 주입해 준다.


Next

  • 추후에 AutowiredAnnotationBeanPostProcessor가 동작을 더 자세하게 알아봐야겠다.


Reference


Comments

Content