본문 바로가기

Spring

Spring Event UnderTheHood

 

Spring을 이용해 개발하다보면, 모듈간 결합도를 낮추기 위해 Spring Event를 활용하는 케이스가 있다. Spring Event를 편리하게 사용하고 있다 문득 내부 동작 원리가 궁금해 코드를 살펴봤다.

 

이번글은 Spring Event 동작 방식에 대해 설명하는 글이다.

 

크게 2가지 동작의 원리를 살펴보겠다.

1. @EventListener 애노테이션을 통한 Handler 등록 과정

2. ApplicationEventPublisher를 이용해 Event를 발행할 때 Event가 Listener로 전송되는 과정

 

@EventListener 애노테이션을 통한 Handler 등록 과정

Flow

ApplicationContext Refresh 과정에 EventListenerMethodProcessor 부터 @EventListener 애노테이션이 붙은 method들을 가져와, EventListenerFactory를 이용해 Listener 객체를 생성한 후에 EventListener로 등록한다.

 

각 과정을 자세히 살펴보면 아래와 같다.

 

AbstactApplicationContext

Application Context Refresh 과정에서 DefaultListableBeanFactory를 이용해 Singleton Bean을 초기화한다.

 

DefaultListableBeanFactory

preInstantiateSingletons method에서 싱글톤들을 초기화하고, post-initialization callback을 호출한다.

 

 

EventListenerMethodProcessor

afterSingletonInstantiated method에서 processBean을 호출

 

processBean method에서 @EventListener 애노테이션이 붙은 메서드들을 가져와, EventListenerFactory를 이용해 EventListener 객체를 생성 후 context에 리스너들을 등록한다.

 

 

ApplicationEventPublisher를 이용해 Event를 발행할 때 Event가 Listener로 전송되는 과정

Flow

ApplicationEventPublisher(기본 구현체가 AbstractApplicationContext)의 publishEvent 메서드가 실행되면, 내부적으로 ApplicationEventMutlicaster(기본 구현체가 SimpleApplicationEventMutlicaster)에게 이벤트 처리를 위임한다.

ApplicationEventMulticaster에선 자신이 갖고 있는 ApplicationListener를 이용해 Event를 처리한다.

 

AbstractApplicationContext

publishEvent method에서 ApplicationEventMulticaster에게 이벤트 처리 위임한다.

 

SimpleApplicationEventMulticaster

multicastEvent method에서 ApplicationListener를 이용해 Event를 처리한다.