spring boot @ComponentScan

무지성개발자·2023년 10월 7일
0

@ComponentScan

ComponentScan은 빈으로 관리해야 할 객체들을 찾아서 빈으로 등록 해준다. 일반적으로 @ComponentScan의 위치 부터 하위 패키지를 돌면서 @Component와 @Bean 어노테이션을 가지고 있는 객체 찾아 빈으로 등록 한다.

빈 등록 순서

패키지를 돌면서 빈 등록을 하면 어떤 순서로 등록이 될까? 상위 패키지부터 하위 패키지 순서로 등록이 될까? 한번 해봤다.
위와 같은 구조에 BController는 AService, BService를 의존하고, BService는 CService를 의존하도록 했다.

상위 패키지 부터 하위 패키지 순서로 Scan을 하니 Controller들이 먼저 등록이 되고 Service들이 등독이 될 것 같지만 결과는 아니었다. 왜 이렇게 순서가 달랐는지 Scan과정을 요약하면 이렇다.

  • 우선 @ComponentScan이 있는 TestApplication이 시작점이니 가정 처음 등록이 된다.
  • AController 스캔 -> 의존이 없음 -> 빈 등록
  • BController 스캔 -> AService, BService 의존 -> 빈 등록 보류
    • Aservice 스캔 -> 의존 없음 -> 빈 등록
    • Bservice 스캔 -> CService 의존 -> 빈 등록 보류
      • CService 스캔 -> 의존 없음 -> 빈 등록
    • CService 빈을 가져와 BService 빈 등록
    • AService, BService 빈을 가져와 BController 빈 등록
  • CController 스캔 -> 의존 없음 -> 빈 등록

위 와 같은 과정을 요약 하자면

  • 상위 패키지에서 하위 패키지 순서로 스캔
  • 의존하는 객체가 있으면 빈 등록 보류 후 의존 객체부터 빈 등록

한 줄평 : AbstractAutowireCapableBeanFactory 클래스의 createBeanInstance() 메소드를 디버거 걸어서 확인해봤다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글