摘要:前言由于之前使用事件機(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)鍵方法為AbstractApplicationContext的initApplicationEventMulticaster()方法
ApplicationListener的初始化與注冊(cè),關(guān)鍵方法為AbstractApplicationContext的registerListeners()方法
這塊不細(xì)說(shuō),感興趣的可以自行跟蹤關(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對(duì)象,將其轉(zhuǎn)換為ApplicationEvent ApplicationEvent applicationEvent; if (event instanceof ApplicationEvent) { applicationEvent = (ApplicationEvent) event; } else { applicationEvent = new PayloadApplicationEvent
通過(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
摘要:哪吒社區(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...
摘要:前言以下源碼基于版本解析。實(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è)可以容...
摘要:探索專為而設(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...
摘要:是一個(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ù)框架,...
閱讀 3463·2023-04-26 01:46
閱讀 3030·2023-04-25 20:55
閱讀 5627·2021-09-22 14:57
閱讀 3035·2021-08-27 16:23
閱讀 1774·2019-08-30 14:02
閱讀 2129·2019-08-26 13:44
閱讀 703·2019-08-26 12:08
閱讀 3191·2019-08-26 11:47