스프링 Autowired 작동 방식

고승원·2023년 5월 31일
2

Spring

목록 보기
7/13

@Autowired 어노테이션은 스프링 프레임워크에서 의존성 주입을 자동화하기 위해 사용된다.

의존성 주입은 빈 라이프사이클 마지막에 진행되며, BeanPostProcessor의 구현체인 AutowiredAnnotationBeanPostProcessor를 사용한다.

코드

  1. bean을 가져와서 메타데이터를 추출한다.
  2. 인젝션을 하는데, 이때 BeanCreationException이 발생할 수도 있다. 이 에러는 의존성주입이 안되거나, 빈에 문제가 있는 경우 사용된다.

InjectionMetadata의 inject 메서드

메서드 주입(생성자, 메서드)과 필드주입 두가지는 이너클래스로 구분이 된다.
보통은 생성자 주입을 하기 때문에 MethodElement클래스의 메서드를 살펴보자.

실제 InjectionMetadata 클래스를 사용하지 않고, 그를 상속하는 AutowiredAnnotationBeanPostProcessor에서 오버라이딩한 inject메서드를 사용한다.
생성자 주입의 경우기 때문에 필드 주입의 경우 코드가 조금 다르다

  1. member를 메서드로 캐스팅한다. (@Autowired가 붙어있는 메서드 또는 생성자)
  2. arguments 변수를 선언한다. (메서드의 인수들을 저장할 배열)
  3. 캐싱된 값이 있다면 가져오고 없다면 resolveMethodArguments 메서드를 사용해서 arguments를 초기화한다.
  4. 메서드의 인수가 있는 경우엔 Reflection을 사용해서 메서드의 접근제한자를 변경하고, invoke메소드를 호출해서 bean을 주입한다.

동작 과정

  1. 컨테이너 초기화
    애플리케이션이 올라가면 스프링 컨테이너가 초기화되고 빈들이 생성된다.

  2. 의존성 검색
    @Autowired 어노테이션이 적용된 필드, 생성자, 메서드를 스캔하여 의존성을 찾는다.

  3. 타입 매칭
    @Autowired 어노테이션이 적용된 필드, 생성자, 메서드의 매개변수와 2에서 검색된 의존성의 타입이 맞는 빈을 찾는다.
    이때 타입 -> 이름 -> @Qualifier 순으로 검색을 한다.

  4. 의존성 주입
    3에서 빈을 찾으면 해당 빈을 의존성으로 주입한다.

  5. 빈 초기화
    의존성 주입이 완료되면 빈은 초기화되어 해당 빈은 사용할 준비가 된 상태.

profile
봄은 영어로 스프링

1개의 댓글

comment-user-thumbnail
2023년 5월 31일

타입매칭시 타입 -> 이름 -> @Qualifier 순으로 이루어진다는 걸 알게됐네요! 잘 읽고 갑니다

답글 달기