Heim > Java > javaLernprogramm > Hauptteil

Detaillierte Analyse des Quellcodes des Spring-Ereignismechanismus

不言
Freigeben: 2019-03-27 10:35:16
nach vorne
2820 Leute haben es durchsucht

Dieser Artikel bietet Ihnen eine detaillierte Analyse des Quellcodes des Spring-Ereignismechanismus. Ich hoffe, er wird Ihnen als Referenz dienen.

Vorwort: Da es zuvor Probleme bei der Verwendung des Spring-Ereignismechanismus gab, habe ich versucht, den Quellcode dieses Artikels zu verstehen. Der Spring-Ereignismechanismus ist eigentlich die Veröffentlichung/das Abonnement von Ereignissen (beachten Sie, dass sich das Abonnement in Spring auf das Zuhören bezieht).

PS: Spring-Version ist 5.1.5.RELEASE

Quellcode-Analyse

Initialisierung

Der Schlüssel zur Initialisierung ist die Registrierung von Kernkomponenten

1. Die Schlüsselmethode ist die Methode PrepareBeanFactory() von AbstractApplicationContext. 2. Initialisierung und Registrierung von ApplicationEventMulticaster() 🎜>

3. Die Schlüsselmethode für die Initialisierung und Registrierung von ApplicationListener ist die Methode registerListeners() von AbstractApplicationContext.

Ich werde hier nicht auf Details eingehen selbst

Ereignisveröffentlichung/-abonnement

Die Schlüsselmethode für die Veröffentlichung/das Abonnement von Ereignissen ist „publishEvent“ von AbstractApplicationContext. Der Quellcode lautet wie folgt:

    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);
            }
        }
    }
Nach dem Login kopieren
Durch Codeverfolgung wurde festgestellt, dass Spring die Standardimplementierung von ApplicationEventMulticaster, SimpleApplicationEventMulticaster, verwendet, um die Ereignisüberwachung auszulösen. Die Schlüsselmethode für die Methode multicastEvent() lautet wie folgt:

    @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);
            }
        }
    }
Nach dem Login kopieren
Dieser Artikel lautet Weitere spannende Inhalte finden Sie in der Rubrik

Java Video Tutorial

auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonDetaillierte Analyse des Quellcodes des Spring-Ereignismechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage