SpringBoot源碼閱讀(3)——監聽器

ApplicationListener類初始化位置

在類SpringApplication的構造方法,第267行
在這里插入圖片描述
META-INFO/spring.factories中配置的實現類
spring-boot

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.env.EnvironmentPostProcessorApplicationListener

spring-boot-autoconfigure

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

相關類

在這里插入圖片描述

  • ApplicationEvent 事件祖先類
  • org.springframework.context.event.ApplicationEventMulticaster 事件多播器
  • org.springframework.context.event.SmartApplicationListener 監聽器
  • org.springframework.context.event.GenericApplicationListener 監聽器
  • org.springframework.context.event.EventListener 監聽器

SpringBoot啟動過程中的事件,都由org.springframework.context.event.ApplicationEventMulticaster播出去,讓監聽器處理。

監聽器觸發邏輯

從加載開始

入口在SpringApplication的構造方法,第267行
類工廠加載ApplicationListener的實現類

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

然后在SpringApplication的實例方法run中,第297行,加載SpringApplicationRunListeners類,這個類中持有多播器的引用。

SpringApplicationRunListeners listeners = getRunListeners(args);

SpringApplicationRunListeners實例化的時候,會通過工廠類加載SpringApplicationRunListener

private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger,getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),this.applicationStartup);
}

SpringApplicationRunListener的實現類

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener

EventPublishingRunListener中持有的監聽器,就是SpringApplication中加載的ApplicationListener的實現類

public EventPublishingRunListener(SpringApplication application, String[] args) {this.application = application;this.args = args;this.initialMulticaster = new SimpleApplicationEventMulticaster();for (ApplicationListener<?> listener : application.getListeners()) {this.initialMulticaster.addApplicationListener(listener);}
}
  • ClearCachesApplicationListener
  • ParentContextCloserApplicationListener
  • FileEncodingApplicationListener
  • AnsiOutputApplicationListener
  • DelegatingApplicationListener
  • LoggingApplicationListener
  • EnvironmentPostProcessorApplicationListener
  • BackgroundPreinitializer

存儲

然后這些監聽器被放入了SimpleApplicationEventMulticaster簡單多播器里面

@Override
public void addApplicationListener(ApplicationListener<?> listener) {synchronized (this.defaultRetriever) {// Explicitly remove target for a proxy, if registered already,// in order to avoid double invocations of the same listener.Object singletonTarget = AopProxyUtils.getSingletonTarget(listener);if (singletonTarget instanceof ApplicationListener) {this.defaultRetriever.applicationListeners.remove(singletonTarget);}this.defaultRetriever.applicationListeners.add(listener);this.retrieverCache.clear();}
}

默認的defaultRetriever則是一個內部類DefaultListenerRetriever
在這里插入圖片描述

觸發

會在多個地方觸發,比如
SpringApplicationrun方法,第298行

listeners.starting(bootstrapContext, this.mainApplicationClass);

觸發過程又涉及到事件的設計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42838.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Top級“水刊”!高達10.1分,發文量大,最快1個月左右錄用,幾乎沾邊可錄!

本周投稿推薦 SCI ? 能源科學類&#xff0c;1.5-2.0&#xff08;來稿即錄25天&#xff09; ? 計算機類&#xff0c;2.0-3.0&#xff08;純正刊29天錄用&#xff09; EI ? 各領域沾邊均可&#xff08;2天錄用&#xff09; 知網 ? 7天錄用-檢索&#xff08;急錄友好&…

【YOLOv5進階】——替換主干網絡(backbone)-MobileNet為例

聲明:筆記是做項目時根據B站博主視頻學習時自己編寫,請勿隨意轉載! 一、說在前面的一些話 1、torchvision 需要用到torchvision里的一些模塊,之前第一期配置環境的時候已經安裝過torchvision! torchvision是PyTorch生態系統中的一個關鍵庫,專門為計算機視覺任務設計和優…

個性化微課教學視頻推薦系統-計算機畢業設計源碼77648

個性化微課教學視頻推薦系統 摘 要 隨著信息技術的迅猛發展&#xff0c;教育領域正經歷著前所未有的變革。微課作為一種新興的教學資源形式&#xff0c;以其短小精悍、針對性強、易于傳播等特點&#xff0c;逐漸受到廣大師生的青睞。然而&#xff0c;在微課資源日益豐富的今天…

Python語法基礎

python語法 TIPS&#xff1a;本文適合有一定編程語言基礎的人快速復習python基本語法 python的IO&#xff1a; 基礎input ainput()&#xff1a;默認輸入 基礎output print():默認輸出 默認換行參數end""控制字母之間的距離,可以理解為默認為換行符&#xff0c;修改…

谷粒商城學習筆記-逆向工程錯誤記錄

文章目錄 1&#xff0c;Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中&#xff0c;新增如下配置&#xff1a;1.2&#xff0c;執行clean命令刷新maven配置 2&#xff0c;internal java compiler error3&#xff0c;啟動逆向工程報錯&#x…

【Linux】網絡新手村

歡迎來到 破曉的歷程的 博客 ??不負時光&#xff0c;不負己?? 引言 今天&#xff0c;我們就開始學習Linux網絡相關的內容。這篇博客作為Linux網絡板塊的第一篇博客看&#xff0c;我們首先要帶著大家明白Linux網絡的一些名詞的概念&#xff0c;為之后的學習掃清障礙。然后我…

Bootstrap 按鈕下拉菜單

Bootstrap 按鈕下拉菜單 簡介 Bootstrap 是一個流行的前端框架&#xff0c;用于快速開發響應式和移動設備優先的網頁。它提供了一套豐富的組件&#xff0c;包括導航、下拉菜單、按鈕等&#xff0c;使得開發者能夠輕松構建功能豐富且美觀的界面。在本文中&#xff0c;我們將重…

新加坡工作和生活指北:餐飲出行篇

文章首發于公眾號&#xff1a;Keegan小鋼 ?餐飲 前一篇文章 說到&#xff0c;有些房東不允許房客煮飯&#xff0c;那在新加坡都去哪吃飯&#xff1f;有什么吃的呢&#xff1f; 比較便宜的餐飲場所就是小販中心、咖啡店和冷氣食閣&#xff0c;也是大部分人常去的就餐場所。咖…

分布式整合

一、分布式架構介紹 什么是分布式系統 分布式系統指一個硬件或軟件組件分布在不同的網絡計算機上&#xff0c;彼此之間僅僅通過消息傳遞進行通信和協調的系統。 通俗的理解&#xff0c;分布式系統就是一個業務拆分成多個子業務&#xff0c;分布在不同的服務器節點&#xff0…

使用Java實現復雜數據結構算法

使用Java實現復雜數據結構算法 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 前言 在軟件開發中&#xff0c;復雜數據結構和算法是提升程序效率和性能的重要組成部分。本文將通過Java語言&…

OCR技術主要用于自動化文本數據的錄入

OCR是“Optical Character Recognition”的縮寫&#xff0c;中文意思是光學字符識別。這是一種技術&#xff0c;允許電子設備如掃描儀或數碼相機讀取文檔中的文本&#xff0c;通過檢測和分析文本的暗和亮的模式來識別字符的形狀&#xff0c;然后將這些形狀轉換為可被計算機處理…

ASP.NET Core----基礎學習03----開發者異常頁面 MVC工作原理及實現

文章目錄 1. 開發者異常頁面(1)Startup.cs 頁面的基礎配置(2)自定義顯示報錯代碼的前后XX行 2. MVC 的原理3. MVC 的實現4.默認路由路徑5.返回Json字符串 1. 開發者異常頁面 (1)Startup.cs 頁面的基礎配置 namespace ASP.Net_Blank {public class Startup{private readonly IC…

FlowUs息流:提升學術研究效率的協作神器

在學術界&#xff0c;論文撰寫和小組協作是日常研究工作的重要組成部分。FlowUs作為一個多功能的協作平臺&#xff0c;為大學教授和學生提供了一個無縫的工作環境&#xff0c;使這些任務變得更加順暢。 FlowUs模板中心 高校學生教師 專用模板免費 &#x1f393; 教授的論文管…

Webpack安裝以及快速入門

3 Webpack 1 什么是Webpack https://webpack.js.org/ (官網) webpack 是一個現代 javascript 應用程序的 靜態模塊打包器 (module bundler) 待會要學的 vue-cli 腳手架環境, 集成了 webpack, 所以才能對各類文件進行打包處理 webpack是一個 靜態模塊 打包器,可以做以下的這…

Spring Boot (9):AOP實戰經驗

1 概述 介紹完Spring AOP所具備的功能特性&#xff0c;接下來&#xff0c;看一下再應用程序中使用AOP時應該遵循哪些最佳實踐。 2 活用切點表達式 Spring AOP的一大特色在于在開發人員提供了非常靈活的切點機制。Spring在編譯期間處理切入點&#xff0c;并嘗試進行優化匹配。然…

計算機的錯誤計算(二十四)

摘要 計算機的錯誤計算&#xff08;二十一&#xff09;就案例 展示了“兩個不相等數相減&#xff0c;差為0”。本節給出新的計算過程&#xff1a;不停增加計算精度直到出現非0結果。這個過程與結果表明&#xff0c;即使是專業數學軟件&#xff0c;對這個問題的處理&#xff0…

1 HTML and CSS

HTMl(超文本標記語言) HTML 概述 超文本標記語言用來描述和定義網頁的內容 HTML(超文本標記語言——HyperText Markup Language)是構成 Web 世界的一磚一瓦;它定義了網頁內容的含義和結構 “超文本”(hypertext)是指連接單個網站內或多個網站間的網頁的鏈接 1. HTML標簽功能區分…

Qt之多線程編程(QThread)

文章目錄 前言Qt多線程的基本使用如何移動線程常用的一些函數示例代碼總結 前言 在現代計算機系統中&#xff0c;多線程編程已經成為一種常見的編程模式&#xff0c;它可以有效地利用多核處理器的計算能力&#xff0c;提高程序的執行效率。Qt作為一種跨平臺的應用程序開發框架…

【ffmpeg系列一】源碼構建,ubuntu22與win10下的過程對比。

文章目錄 背景ubuntu22結論 win10過程 對比結論 背景 順手編譯個ffmpeg試試&#xff0c;看看不同平臺下誰的配置比較繁瑣。 先讓gpt給出個教程&#xff1a; ubuntu22 使用elementary-os7.1構建&#xff0c;看看有幾個坑要踩。 錯誤1&#xff1a; 依賴libavresample-dev未…