亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring事件機(jī)制源碼分析

baukh789 / 2256人閱讀

摘要:前言由于之前使用事件機(jī)制出現(xiàn)了問(wèn)題,所以特意去了解這塊的源碼。事件機(jī)制其實(shí)就是事件發(fā)布訂閱注意在中訂閱指的是監(jiān)聽(tīng)。

前言

由于之前使用Spring事件機(jī)制出現(xiàn)了問(wèn)題,所以特意去了解這塊的源碼。Spring事件機(jī)制其實(shí)就是事件發(fā)布/訂閱(注意在Spring中訂閱指的是監(jiān)聽(tīng))。

PS:Spring版本為5.1.5.RELEASE

源碼分析 初始化

初始化這塊關(guān)鍵是核心組件的注冊(cè)

ApplicationEventPublisher的初始化與注冊(cè),關(guān)鍵方法為AbstractApplicationContext的方法prepareBeanFactory()

ApplicationEventMulticaster的初始化與注冊(cè),關(guān)鍵方法為AbstractApplicationContextinitApplicationEventMulticaster()方法

ApplicationListener的初始化與注冊(cè),關(guān)鍵方法為AbstractApplicationContextregisterListeners()方法

這塊不細(xì)說(shuō),感興趣的可以自行跟蹤關(guān)鍵方法

事件發(fā)布/訂閱

事件發(fā)布/訂閱的關(guān)鍵方法為AbstractApplicationContextpublishEvent,源碼如下:

    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對(duì)象,將其轉(zhuǎn)換為ApplicationEvent
        ApplicationEvent applicationEvent;
        if (event instanceof ApplicationEvent) {
            applicationEvent = (ApplicationEvent) event;
        }
        else {
            applicationEvent = new PayloadApplicationEvent(this, event);
            if (eventType == null) {
                eventType = ((PayloadApplicationEvent) applicationEvent).getResolvableType();
            }
        }

        // 是否延遲多播,即將事件發(fā)布到所有監(jiān)聽(tīng)器中
        if (this.earlyApplicationEvents != null) {
            this.earlyApplicationEvents.add(applicationEvent);
        }
        else {
            //此處為事件監(jiān)聽(tīng)處理器的調(diào)用關(guān)鍵
            getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
        }

        // 是否將事件發(fā)布到父容器中
        if (this.parent != null) {
            if (this.parent instanceof AbstractApplicationContext) {
                ((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
            }
            else {
                this.parent.publishEvent(event);
            }
        }
    }

通過(guò)代碼跟蹤,發(fā)現(xiàn)Spring中使用ApplicationEventMulticaster的默認(rèn)實(shí)現(xiàn)SimpleApplicationEventMulticaster來(lái)觸發(fā)事件的監(jiān)聽(tīng),關(guān)鍵方法為multicastEvent()方法,源碼如下:

    @Override
    public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
        // 獲取事件類型
        ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
        for (final ApplicationListener listener : getApplicationListeners(event, type)) {//依次遍歷事件監(jiān)聽(tīng)器
            // 獲取線程池
            Executor executor = getTaskExecutor();
            if (executor != null) {//線程池不為null,則異步調(diào)用監(jiān)聽(tīng)器
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        invokeListener(listener, event);
                    }
                });
            }
            else {// 同步調(diào)用監(jiān)聽(tīng)器
                invokeListener(listener, event);
            }
        }
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73958.html

相關(guān)文章

  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • Spring專題之IOC源碼分析

    摘要:前言以下源碼基于版本解析。實(shí)現(xiàn)源碼分析對(duì)于的實(shí)現(xiàn),總結(jié)來(lái)說(shuō)就是定位加載和注冊(cè)。定位就是需要定位配置文件的位置,加載就是將配置文件加載進(jìn)內(nèi)存注冊(cè)就是通過(guò)解析配置文件注冊(cè)。下面我們從其中的一種使用的方式一步一步的分析的實(shí)現(xiàn)源碼。 前言 以下源碼基于Spring 5.0.2版本解析。 什么是IOC容器? 容器,顧名思義可以用來(lái)容納一切事物。我們平常所說(shuō)的Spring IOC容器就是一個(gè)可以容...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • Java進(jìn)階之路

    摘要:探索專為而設(shè)計(jì)的將探討進(jìn)行了何種改進(jìn),以及這些改進(jìn)背后的原因。關(guān)于最友好的文章進(jìn)階前言之前就寫(xiě)過(guò)一篇關(guān)于最友好的文章反響很不錯(cuò),由于那篇文章的定位就是簡(jiǎn)單友好,因此盡可能的摒棄復(fù)雜的概念,只抓住關(guān)鍵的東西來(lái)講,以保證大家都能看懂。 周月切換日歷 一個(gè)可以進(jìn)行周月切換的日歷,左右滑動(dòng)的切換月份,上下滑動(dòng)可以進(jìn)行周,月不同的視圖切換,可以進(jìn)行事件的標(biāo)記,以及節(jié)假日的顯示,功能豐富 Andr...

    sushi 評(píng)論0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服務(wù)架構(gòu)分析

    摘要:是一個(gè)相對(duì)比較新的微服務(wù)框架,年才推出的版本雖然時(shí)間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實(shí)現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問(wèn)題。通過(guò)互相注冊(cè)的方式來(lái)進(jìn)行消息同步和保證高可用。 Spring Cloud 是一個(gè)相對(duì)比較新的微服務(wù)框架,...

    cikenerd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<