Spring事件監聽機制(三)

? ? ? 為了理解@EvenListener注解的底層原理,我們可以自己實現一個類似的注解模擬實現。

1.定義@MyListener注解

    @Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MyListener {}

2.注解使用

    @Componentstatic class SmsService {private static final Logger log = LoggerFactory.getLogger(SmsService.class);@MyListenerpublic void listener(MyEvent event) {log.debug("發送短信");}}

3.注解解析

public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestMyListener.class);SmsService smsService = context.getBean(SmsService.class);for(Method method : SmsService.class.getMethods()){if(method.isAnnotationPresent(MyListener.class)){ApplicationListener listener = new ApplicationListener<MyEvent>() {@Overridepublic void onApplicationEvent(MyEvent event) {try {method.invoke(smsService, event);}catch (Exception e){e.printStackTrace();}}};context.addApplicationListener(listener);}}context.getBean(MyService.class).doBusiness();context.close();}

?1)獲取監聽器類

?2)通過反射拿到方法

? ? ? ?判斷方法上的注解是否是我們自定義的注解,如果是,創建ApplicationListener對象(這里使用了泛型去指定事件類型,如果不這樣做可能會接收到別的事件而報錯,比如說容器關閉事件),重寫里面的監聽事件的方法,通過反射調用加了@MyListener注解的方法。

?3)把監聽器加入容器里面。

打印結果:

@MyListener注解實現了事件監聽機制。

?4.改進點

? ? ? ?上面我們固定解析了監聽類為SmsService類,現實情況是其它類上也可能加了@MyListener注解,我們可以做得更通用一些。

? ? ? ?(1)再寫一個監聽類EmailService。

    @Componentstatic class EmailService {private static final Logger log = LoggerFactory.getLogger(EmailService.class);@MyListenerpublic void listener(MyEvent event) {log.debug("發送郵件");}}

? ? ? ? ?2)遍歷所有滿足條件的bean

public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestMyListener.class);for (String beanName : context.getBeanDefinitionNames()){Object bean = context.getBean(beanName);for(Method method : bean.getClass().getMethods()){if(method.isAnnotationPresent(MyListener.class)){ApplicationListener listener = new ApplicationListener<MyEvent>() {@Overridepublic void onApplicationEvent(MyEvent event) {try {method.invoke(bean, event);}catch (Exception e){e.printStackTrace();}}};context.addApplicationListener(listener);}}}context.getBean(MyService.class).doBusiness();context.close();}

? ? ? ? ? ? 3)測試結果

? ? ? ?容器監聽了所有實現@MyListener注解的方法。

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

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

相關文章

基于Springboot + vue3實現的小區物業管理系統

項目描述本系統包含管理員和用戶兩個角色。管理員角色&#xff1a;用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。房屋信息管理&#xff1a;管理房屋信息&#xff0c;包括新增、查看、修改和刪除房屋信息。車輛信息管理&#xff1a;管理…

交叉熵和KL散度

這個問題之前我也是傻傻分不清&#xff0c;決定整理一下&#xff0c;用更印象深刻的方式讓人記住。核心聯系&#xff1a;交叉熵 KL 散度 真實分布的熵 交叉熵作為 “絕對” 度量&#xff0c;會綜合真實分布的熵&#xff08;固有難度&#xff09;與預測誤差&#xff0c;直接體…

HTML 各種事件的使用說明書

HTML 各種事件的使用說明書 1. HTML 事件簡介 HTML事件是瀏覽器或用戶在網頁上執行的動作或發生的事情。當這些事件發生時&#xff0c;可以通過JavaScript來響應和處理這些事件&#xff0c;從而實現網頁的交互功能。事件處理是Web前端開發中實現動態交互的核心機制。 基本概…

Kafka面試精講 Day 10:事務機制與冪等性保證

【Kafka面試精講 Day 10】事務機制與冪等性保證 在分布式消息系統中&#xff0c;如何確保消息不丟失、不重復&#xff0c;是系統可靠性的核心挑戰。Kafka自0.11版本起引入了冪等性Producer和事務性消息機制&#xff0c;徹底解決了“至少一次”語義下可能產生的重復消息問題&am…

時序數據庫簡介和安裝

一、簡介1. 什么是時序數據庫&#xff1f;時序數據庫是專門用于存儲和處理時間序列數據的數據庫系統。時間序列數據是指按時間順序索引的一系列數據點。每個數據點都包含&#xff1a;一個時間戳&#xff1a;記錄數據產生的時間。一個或多個指標值&#xff1a;例如溫度、濕度、C…

comfyUI 暴露網絡restful http接口

https://zhuanlan.zhihu.com/p/686893291 暴露websocket接口。 打開開發者選項 如圖

linux系統address already in use問題解決

linux系統上某個端口被占用&#xff0c;如何解決&#xff1f;1.找到占用的進程編號&#xff1a;netstat -tulnp | grep :80002.強制殺死該進程kill -9 80603其他說明&#xff1a;1.查找占用端口的進程&#xff0c;可以用&#xff1a;lsof -i :8001 # 或者使用 netstat -tulnp |…

基于SpringBoot的家政保潔預約系統【計算機畢業設計選題 計算機畢業設計項目 計算機畢業論文題目推薦】

&#x1f34a;作者&#xff1a;計算機編程-吉哥 &#x1f34a;簡介&#xff1a;專業從事JavaWeb程序開發&#xff0c;微信小程序開發&#xff0c;定制化項目、 源碼、代碼講解、文檔撰寫、ppt制作。做自己喜歡的事&#xff0c;生活就是快樂的。 &#x1f34a;心愿&#xff1a;點…

【Linux系統】 4. 權限(一)

一. shell 命令及運行原理基本理解1&#xff09;廣義理解的操作系統包括&#xff1a;操作系統內核、外殼程序&#xff08;shell命令行、圖形化界面&#xff09;、必要的軟件。2&#xff09;狹義的操作系統&#xff1a;操作系統內核。3&#xff09;在用戶和內核之間有一個外殼程…

6.python——字符串

python中用’ 和" "創建字符串 python的子字符串截取用[]取字符串拼接可以直接用相加。 python三引號允許一個字符串跨多行&#xff0c;其中無需進行轉義&#xff08;所見即所得&#xff09;。 當你需要一塊HTML或者SQL時&#xff0c;這時用字符串組合&#xff0c;特…

足球數據API接口的技術特性與應用價值分析

一、接口概述現代足球數據接口是基于RESTful架構的數據服務&#xff0c;通過標準化方式提供賽事相關信息。這類接口通常采用JSON格式傳輸數據&#xff0c;支持跨平臺調用&#xff0c;為開發者提供結構化的足球賽事數據。二、數據覆蓋范圍主流足球數據接口通常包含以下數據類型&…

<android>反編譯魔改安卓系統應用并替換

我們知道安卓系統基于穩定性、維護便利、性能優化等原因并未對原生系統apk進行混淆加密處理&#xff0c;由此就方便了我們反編譯替換原生應用。 首先我們設備需要是root后的&#xff0c;我是使用的是小米5&#xff0c;刷的24.3版本的面具。首先我們需要取系統apk&#xff0c;這…

【Qt】項目的創建 and 各個控件的使用

一、項目的創建&#x1f50d;然后點擊新建項目。&#x1f4d6;注意&#xff1a;路徑不要帶有中文&#xff0c;不然運行不了代碼。&#x1f4d6;qmake是一個構建工具&#xff0c;在 Qt 寫的程序&#xff0c;設計的到一系列的 "元編程" 技術&#xff0c;什么是元編程技…

大模型架構演進全景:從Transformer到下一代智能系統的技術路徑(MoE、Mamba/SSM、混合架構)

當前大模型發展正經歷著一個關鍵的技術分水嶺。雖然Transformer架構自2017年問世以來主導了整個AI領域&#xff0c;但我們正見證著多種創新架構的涌現&#xff0c;每種都在試圖解決Transformer的固有局限。本指南將系統性地解析當前主流架構的技術原理、適用場景與發展趨勢&…

畫世界筆刷合集(2000 + 款):含宮崎駿森系、鴨風人像、國潮等多風格 + 視頻導入教程

預覽&#xff1a; https://blog.csdn.net/2501_93092597/article/details/151330089?spm1011.2415.3001.5331 想在畫世界創作卻缺適配筆刷&#xff1f;手動繪制森系元素、人像細節耗時久&#xff0c;導入筆刷總失敗&#xff0c;找配套背景 / 配色還得跨平臺搜索&#xff1f;這…

03-Redis 安裝指南:從版本選擇到多系統部署(Windows+macOS+Linux)

目錄引言一、安裝 Redis 前必須明確的核心問題二、Redis 版本選擇&#xff1a;穩定版 vs 開發版&#xff0c;該怎么選&#xff1f;2.1 版本規則&#xff1a;看 “次版本號” 辨穩定性2.2 穩定版與開發版核心差異2.3 版本選擇建議三、多系統安裝教程&#xff1a;step-by-step 實…

普通MYSQL數據庫是怎么做sum操作的

MySQL 的 SUM()操作實現是一個結合??執行引擎優化、存儲結構利用和分組算法??的高效過程。以下是其核心實現機制和優化策略&#xff1a;??1. 執行流程概覽??以查詢為例&#xff1a;SELECT department, SUM(salary) FROM employees GROUP BY department;??執行步驟??…

Claude-Flow AI協同開發:基礎入門之 AI編排

1.1 引言&#xff1a;超越“代碼生成器”的革命 在AI輔助開發的浪潮中&#xff0c;我們已經習慣了代碼補全、函數生成等“代碼生成器”工具。它們極大地提升了我們的編碼效率&#xff0c;但通常僅限于解決孤立、單一的問題。當面對一個完整的項目或一個復雜的功能模塊時&#x…

Linux中下載安裝部署Redis7.4.5——并設置用戶名、密碼及其授權的保姆級教程

一、環境準備 環境準備 序號 說明 1 使?RHEL9或Almalinux9.1及其更高版本系統 #查看系統信息 cat /etc/os-release 2 Linux中需要Redis源碼編譯所需的gcc依賴 #1-檢查是否已

健康度——設備健康續航條

在故障診斷與健康管理&#xff08;PHM&#xff09;領域和壽命預測領域中&#xff0c;健康度&#xff08;Health Index, HI&#xff09;是一個至關重要的概念&#xff0c;它旨在量化設備或系統的當前健康狀態&#xff0c;并為預測其剩余使用壽命&#xff08;Remaining Useful Li…