> Java > java지도 시간 > Spring 이벤트 메커니즘 소스 코드의 상세 분석

Spring 이벤트 메커니즘 소스 코드의 상세 분석

不言
풀어 주다: 2019-03-27 10:35:16
앞으로
2835명이 탐색했습니다.

이 기사는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿