@Autowired
어노테이션은 스프링 프레임워크에서 의존성 주입을 자동화하기 위해 사용된다.
의존성 주입은 빈 라이프사이클 마지막에 진행되며, BeanPostProcessor
의 구현체인 AutowiredAnnotationBeanPostProcessor
를 사용한다.
BeanCreationException
이 발생할 수도 있다. 이 에러는 의존성주입이 안되거나, 빈에 문제가 있는 경우 사용된다.InjectionMetadata의 inject 메서드
메서드 주입(생성자, 메서드)과 필드주입 두가지는 이너클래스로 구분이 된다.
보통은 생성자 주입을 하기 때문에 MethodElement
클래스의 메서드를 살펴보자.
실제 InjectionMetadata 클래스를 사용하지 않고, 그를 상속하는 AutowiredAnnotationBeanPostProcessor
에서 오버라이딩한 inject메서드를 사용한다.
생성자 주입의 경우기 때문에 필드 주입의 경우 코드가 조금 다르다
@Autowired
가 붙어있는 메서드 또는 생성자)컨테이너 초기화
애플리케이션이 올라가면 스프링 컨테이너가 초기화되고 빈들이 생성된다.
의존성 검색
@Autowired
어노테이션이 적용된 필드, 생성자, 메서드를 스캔하여 의존성을 찾는다.
타입 매칭
@Autowired
어노테이션이 적용된 필드, 생성자, 메서드의 매개변수와 2에서 검색된 의존성의 타입이 맞는 빈을 찾는다.
이때 타입 -> 이름 -> @Qualifier
순으로 검색을 한다.
의존성 주입
3에서 빈을 찾으면 해당 빈을 의존성으로 주입한다.
빈 초기화
의존성 주입이 완료되면 빈은 초기화되어 해당 빈은 사용할 준비가 된 상태.
타입매칭시 타입 -> 이름 -> @Qualifier 순으로 이루어진다는 걸 알게됐네요! 잘 읽고 갑니다