[Spring] : Autowiring 과정

dohyoungK·2024년 5월 22일
0

면접 스크립트

목록 보기
29/30

[Spring] : Autowiring 과정


@Autowired란?

@Autowired는 의존 관계 주입을 할 때 사용하는 어노테이션이며, 의존 객체의 타입에 해당하는 빈을 찾아 주입하는 역할을 한다.

빈을 찾는 과정

빈의 인스턴스가 만들어지는 라이프 사이클 중, BeanPostProcessor는 빈의 초기화 단계 이전과 이후 또 다른 부가적인 작업을 할 수 있게 하는 인터페이스이다.

빈에 접근해야 하기 때문에 빈을 관리하는 스프링 컨테이너에 등록이 되어 있다.

BeanPostProcessor를 보면 빈의 초기화 이전과 이후에 해당하는 postProcessBeforeInitialization 메소드와 postProcessAfterInitialization 메소드가 존재하는 것을 확인할 수 있다.

위에서 설명한 BeanPostProcessor도 구현체가 있어야 메소드를 이용할 수 있다.

@Autowired에 있어서 핵심이 되는 클래스는 AutowiredAnnotationBeanPostProcessor이고, 이것 또한 빈에 접근해야 되기 때문에 빈을 관리하는 스프링 컨테이너에 등록되어 있다.

그리고 빈의 초기화 라이프 사이클 이전에 @Autowired가 붙은 빈을 찾아 주입하는 역할을 한다.

이 processInjection 메소드를 사용해 빈의 클래스 정보를 읽어와 자동으로 의존 관계를 설정할 메타데이터를 얻고 주입한다.

그리고 위의 inject 메소드가 객체를 주입할 때 ReflectionUtils 클래스를 사용하는 것을 볼 수 있다.

즉, @Autowired는 리플렉션(구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API)을 통해 수행된다.

실제로 AutowiredAnnotationBeanPostProcessor는 injectMetadata를 상속받는 AutowiredFieldElement와 AutowiredMethodElement를 구현하며 필드나 메소드 각각에 맞게 inject 메소드가 호출된다.

동작 순서

  • BeanFactory( ApplicationContext )가 BeanPostProcessor 타입의 Bean을 찾는다.
  • IoC 컨테이너에 등록되어있는 다른 일반적인 Bean에게 BeanPostProcessor를 적용한다.
  • 다른 Bean에 @Autowired Annotation을 처리하는 AutowiredAnnotationBeanPostProcessor의 로직이 적용된다.
  • 의존성 주입이 일어난다.

0개의 댓글