成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring事件機制源碼分析

baukh789 / 2210人閱讀

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

前言

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

PS:Spring版本為5.1.5.RELEASE

源碼分析 初始化

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

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

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

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

這塊不細說,感興趣的可以自行跟蹤關(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對象,將其轉(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)聽器中
        if (this.earlyApplicationEvents != null) {
            this.earlyApplicationEvents.add(applicationEvent);
        }
        else {
            //此處為事件監(jiān)聽處理器的調(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);
            }
        }
    }

通過代碼跟蹤,發(fā)現(xiàn)Spring中使用ApplicationEventMulticaster的默認實現(xiàn)SimpleApplicationEventMulticaster來觸發(fā)事件的監(jiān)聽,關(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)聽器
            // 獲取線程池
            Executor executor = getTaskExecutor();
            if (executor != null) {//線程池不為null,則異步調(diào)用監(jiān)聽器
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        invokeListener(listener, event);
                    }
                });
            }
            else {// 同步調(diào)用監(jiān)聽器
                invokeListener(listener, event);
            }
        }
    }

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73958.html

相關(guān)文章

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

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

    Scorpion 評論0 收藏0
  • Spring專題之IOC源碼分析

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

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

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

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

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

    cikenerd 評論0 收藏0

發(fā)表評論

0條評論

baukh789

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<