@Autowired는 의존 관계 주입을 할 때 사용하는 어노테이션이며, 의존 객체의 타입에 해당하는 빈을 찾아 주입하는 역할을 한다.
빈의 인스턴스가 만들어지는 라이프 사이클 중, BeanPostProcessor는 빈의 초기화 단계 이전과 이후 또 다른 부가적인 작업을 할 수 있게 하는 인터페이스이다.
빈에 접근해야 하기 때문에 빈을 관리하는 스프링 컨테이너에 등록이 되어 있다.
BeanPostProcessor를 보면 빈의 초기화 이전과 이후에 해당하는 postProcessBeforeInitialization 메소드와 postProcessAfterInitialization 메소드가 존재하는 것을 확인할 수 있다.
위에서 설명한 BeanPostProcessor도 구현체가 있어야 메소드를 이용할 수 있다.
@Autowired에 있어서 핵심이 되는 클래스는 AutowiredAnnotationBeanPostProcessor이고, 이것 또한 빈에 접근해야 되기 때문에 빈을 관리하는 스프링 컨테이너에 등록되어 있다.
그리고 빈의 초기화 라이프 사이클 이전에 @Autowired가 붙은 빈을 찾아 주입하는 역할을 한다.
이 processInjection 메소드를 사용해 빈의 클래스 정보를 읽어와 자동으로 의존 관계를 설정할 메타데이터를 얻고 주입한다.
그리고 위의 inject 메소드가 객체를 주입할 때 ReflectionUtils 클래스를 사용하는 것을 볼 수 있다.
즉, @Autowired는 리플렉션(구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API)을 통해 수행된다.
실제로 AutowiredAnnotationBeanPostProcessor는 injectMetadata를 상속받는 AutowiredFieldElement와 AutowiredMethodElement를 구현하며 필드나 메소드 각각에 맞게 inject 메소드가 호출된다.