[spring] Bean 생성 순서와 Bean Life Cycle (빈 생명주기)
Bean 생성 순서
- Spring : 설정파일을 통해 등록된 bean을 자동적으로 위에서 아래로 bean들을 스캔하여 생성한다.
- Spring Boot : Annotation을 이용해서 bean을 등록하게 되면 패키지에서 존재하는 순서대로(위에서 아래) 스캔하면서 bean을 생성한다. 따라서 알파벳 순서에서 밀린 패키지, 클래스는 생성 순서를 맞춰주지 않는 문제가 생길 수 있을 거라 생각하지만 특정 Bean을 생성하는 도중에 해당 Bean에 주입되는 새로운 Bean을 만나면 이 Bean부터 생성하기 때문에 문제가 되지 않는다.(단, 생성자 주입 방식일 경우에 해당)
위와 같이 XML, @Bean, @Configure, 또는 컴포넌트스캔 방식으로 bean으로 관리할 클래스를 스캔한 뒤 BeanFactory가 reflection을 이용해 bean들을 생성하고 의존관계를 주입한다.
[스프링 부트에서 컴포넌트 스캔방식 + 생성자 주입 방식인 경우]
- Bean 생성자 호출 순서 : controller -> service -> repository (패키지 알파벳 순)
- Bean 생성완료 순서: repository -> service -> controller
[시나리오]
- controller의 생성자를 호출하고 생성자의 parameter를 보고 Bean이면 parameter를 먼저 생성하러 간다.(주입받는 의존성을 먼저 생성)
- 주입받을 의존성을 생성한 뒤 돌아와서 생성자 호출 로직을 이어간다.
cf. @PostConstruct : Bean이 완전히 생성된 이후에 실행되는 콜백 메소드
Bean Life Cycle
1) 스프링 컨테이너 생성
2) 스프링 빈 생성 및 의존관계 주입
3) 초기화 콜백 : 빈이 완전히 생성된 후 호출
4) 빈 사용
5) 소멸전 콜백 : 빈이 소멸되기 직전에 호출
6) 스프링 종료 : Bean 파괴는 생성의 역순임
Ref
- 생성자 기반 DI가 선호되는 이유: https://jh-labs.tistory.com/31