이 기사는 Spring 이벤트 메커니즘 소스 코드에 대한 자세한 분석을 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.
서문: 이전에 Spring 이벤트 메커니즘을 사용하는 데 문제가 있었기 때문에 이 작품의 소스 코드를 이해하러갔습니다. Spring 이벤트 메커니즘은 실제로 이벤트 게시/구독입니다(Spring의 구독은 수신을 참조함).
PS: Spring 버전은 5.1.5입니다.RELEASE
소스 코드 분석
초기화
초기화의 핵심은 핵심 구성 요소 등록입니다
1. ApplicationEventPublisher의 초기화 및 등록이 핵심입니다. ) of AbstractApplicationContext
2. 핵심 메서드는 AbstractApplicationContext의 initApplicationEventMulticaster() 메서드입니다.
3. ApplicationListener의 초기화 및 등록은 AbstractApplicationContext
I입니다. 여기서는 자세히 다루지 않겠습니다. 관심이 있으시면 직접 하셔도 됩니다.
이벤트 게시/구독
이벤트 게시/구독의 핵심 방법은 AbstractApplicationContext의 게시 이벤트입니다.
protected void publishEvent(Object event, ResolvableType eventType) { // 避免空指针 Assert.notNull(event, "Event must not be null"); if (logger.isTraceEnabled()) { logger.trace("Publishing event in " + getDisplayName() + ": " + event); } // 处理event对象,将其转换为ApplicationEvent ApplicationEvent applicationEvent; if (event instanceof ApplicationEvent) { applicationEvent = (ApplicationEvent) event; } else { applicationEvent = new PayloadApplicationEvent<Object>(this, event); if (eventType == null) { eventType = ((PayloadApplicationEvent) applicationEvent).getResolvableType(); } } // 是否延迟多播,即将事件发布到所有监听器中 if (this.earlyApplicationEvents != null) { this.earlyApplicationEvents.add(applicationEvent); } else { //此处为事件监听处理器的调用关键 getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType); } // 是否将事件发布到父容器中 if (this.parent != null) { if (this.parent instanceof AbstractApplicationContext) { ((AbstractApplicationContext) this.parent).publishEvent(event, eventType); } else { this.parent.publishEvent(event); } } }
코드 추적을 통해 Spring은 이벤트 모니터링을 트리거하기 위해 ApplicationEventMulticaster의 기본 구현인 SimpleApplicationEventMulticaster를 사용하는 것으로 나타났습니다. 핵심 메서드는 multicastEvent() 메서드이며 소스 코드는 다음과 같습니다.
@Override public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) { // 获取事件类型 ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {//依次遍历事件监听器 // 获取线程池 Executor executor = getTaskExecutor(); if (executor != null) {//线程池不为null,则异步调用监听器 executor.execute(new Runnable() { @Override public void run() { invokeListener(listener, event); } }); } else {// 同步调用监听器 invokeListener(listener, event); } } }
이 기사는 여기에서 끝났습니다. 더 많은 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트의 Java Video Tutorial 칼럼을 참조하세요.
위 내용은 Spring 이벤트 메커니즘 소스 코드의 상세 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!