摘要:前言由于之前使用事件機制出現了問題,所以特意去了解這塊的源碼。事件機制其實就是事件發布訂閱注意在中訂閱指的是監聽。
前言
由于之前使用Spring事件機制出現了問題,所以特意去了解這塊的源碼。Spring事件機制其實就是事件發布/訂閱(注意在Spring中訂閱指的是監聽)。
PS:Spring版本為5.1.5.RELEASE
源碼分析 初始化初始化這塊關鍵是核心組件的注冊
ApplicationEventPublisher的初始化與注冊,關鍵方法為AbstractApplicationContext的方法prepareBeanFactory()
ApplicationEventMulticaster的初始化與注冊,關鍵方法為AbstractApplicationContext的initApplicationEventMulticaster()方法
ApplicationListener的初始化與注冊,關鍵方法為AbstractApplicationContext的registerListeners()方法
這塊不細說,感興趣的可以自行跟蹤關鍵方法
事件發布/訂閱事件發布/訂閱的關鍵方法為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對象,將其轉換為ApplicationEvent ApplicationEvent applicationEvent; if (event instanceof ApplicationEvent) { applicationEvent = (ApplicationEvent) event; } else { applicationEvent = new PayloadApplicationEvent
通過代碼跟蹤,發現Spring中使用ApplicationEventMulticaster的默認實現SimpleApplicationEventMulticaster來觸發事件的監聽,關鍵方法為multicastEvent()方法,源碼如下:
@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); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73958.html
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:前言以下源碼基于版本解析。實現源碼分析對于的實現,總結來說就是定位加載和注冊。定位就是需要定位配置文件的位置,加載就是將配置文件加載進內存注冊就是通過解析配置文件注冊。下面我們從其中的一種使用的方式一步一步的分析的實現源碼。 前言 以下源碼基于Spring 5.0.2版本解析。 什么是IOC容器? 容器,顧名思義可以用來容納一切事物。我們平常所說的Spring IOC容器就是一個可以容...
摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...
閱讀 3384·2023-04-26 01:46
閱讀 2906·2023-04-25 20:55
閱讀 5471·2021-09-22 14:57
閱讀 2974·2021-08-27 16:23
閱讀 1712·2019-08-30 14:02
閱讀 2063·2019-08-26 13:44
閱讀 644·2019-08-26 12:08
閱讀 2951·2019-08-26 11:47