摘要:前言由于之前使用事件機制出現(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)鍵方法為AbstractApplicationContext的initApplicationEventMulticaster()方法
ApplicationListener的初始化與注冊,關(guān)鍵方法為AbstractApplicationContext的registerListeners()方法
這塊不細說,感興趣的可以自行跟蹤關(guān)鍵方法
事件發(fā)布/訂閱事件發(fā)布/訂閱的關(guān)鍵方法為AbstractApplicationContext的publishEvent,源碼如下:
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
通過代碼跟蹤,發(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
摘要:哪吒社區(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...
摘要:前言以下源碼基于版本解析。實現(xiàn)源碼分析對于的實現(xiàn),總結(jié)來說就是定位加載和注冊。定位就是需要定位配置文件的位置,加載就是將配置文件加載進內(nèi)存注冊就是通過解析配置文件注冊。下面我們從其中的一種使用的方式一步一步的分析的實現(xiàn)源碼。 前言 以下源碼基于Spring 5.0.2版本解析。 什么是IOC容器? 容器,顧名思義可以用來容納一切事物。我們平常所說的Spring IOC容器就是一個可以容...
摘要:是一個相對比較新的微服務(wù)框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務(wù)框架,...
閱讀 3399·2023-04-26 01:46
閱讀 2928·2023-04-25 20:55
閱讀 5501·2021-09-22 14:57
閱讀 2985·2021-08-27 16:23
閱讀 1724·2019-08-30 14:02
閱讀 2073·2019-08-26 13:44
閱讀 653·2019-08-26 12:08
閱讀 2969·2019-08-26 11:47