배경
- SpringApplicationEvent 에서 Spring 프레임워크가 애플리케이션에 관련된 이벤트를 발행하는 것을 이해할 수 있었다.
- Spring Boot에서 어떤 이벤트를 전송하고 있는지 이해한다.
이벤트 목록
애플리케이션 실행 시 아래 순서대로 이벤트가 발생한다.
ApplicatoinStartingEvent: 애플리케이션 실행 이전에 발생한다.ApplicationContextInitializer들과ApplicationListener들의 등록을 제외한 모든 처리 이전에 발생한다.ApplicationContextInitializer:ApplicationContext가 초기화되기 전에 실행되어야 하는 로직이 있을 때 정의하는 콜백 인터페이스ApplicationListener: 애플리케이션에서 발생하는 이벤트를 감지하고 처리하는 역할의 인터페이스
ApplicationEnvironmentPreparedEvent:Environment가 준비 되었지만,ApplicationContext가 생성되기 전에 발생한다.Environment: 애플리케이션의 profile과 properties를 관리하는 인터페이스- 일반적으로
ApplicationContext에서Environment를 필드로 가지고 있다.
ApplicationContextInitializedEvent:ApplicationContext가 생성되고,ApplicationContextInitializer들이 호출되었지만 bean definition이 로드되기 전에 발생한다.- bean definition은 bean에 대한 메타 데이터라서, bean이 초기화되는 것은 아니다.
ApplicationPreparedEvent: bean definition이 로드되고ApplicationContext가 refresh 되기 전에 발생한다.ApplicationContext의 refresh 단계에서 bean definition을 기준으로 bean 초기화가 이루어진다.- component scan으로 bean definition을 추가로 로드하고, 초기화하는 과정도 refresh에서 이루어진다.
ApplicationContext의 refresh 단계에서 동작 과정은 복잡하니 아래의 글의 참고한다.- refresh 단계의 간단한 과정은 아래 순서와 같다.
BeanFactoryPostProcessor들을 실행한다.BeanFactoryPostProcessor구현체 중에ConfigurationClassPostProcessor에 의해서 component-scan이 이루어지고, 스캔이 된 bean들의 definition을 로드한다.
BeanPostProcessor를 등록한다.BeanPostProcessor는@Value,@PostConstruct,@Autowired같이 bean을 생성하고 나서 추가로 처리해줘야되는 작업을 처리해준다.
- 로드한 bean definition을 바탕으로 인스턴스화 한다.
- 생성자로 인스턴스가 생성되면
@Value,@Autowired같은 프로퍼티는 null이 되고, 등록해둔BeanPostProcessor를 통해 값을 추가해준다.
- 생성자로 인스턴스가 생성되면
ApplicationStartedEvent:ApplicationContext가 refresh 된 후 command-line runner 들이 호출되기 전에 발생한다.AvailabilityChangeEvent: 애플리케이션이 live 상태로 간주됨을 나타내기 위해LivenessState.CORRECT로 발생한다.ApplicationReadyEvent: command-line runner 들이 호출되고 발생한다.AvailabilityChangeEvent: 애플리케이션이 요청을 받을 수 있는 상태를 나타내기 위해ReadinessState.ACCEPTING_TRAFFIC로 발생한다.ApplicationFailedEvent: 애플리케이션 시작 과정에서 예외가 던져지면 발생한다.