一、事件監(jiān)聽機制概述
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、做網(wǎng)站與策劃設(shè)計,東遼網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:東遼等地區(qū)。東遼做網(wǎng)站價格咨詢:028-86922220
二、事件監(jiān)聽機制結(jié)構(gòu)
三、Spring監(jiān)聽機制架構(gòu)
Spring的Application擁有發(fā)布事件并且注冊事件監(jiān)聽器的能力,擁有一套完整的事件發(fā)布和監(jiān)聽機制。在Java中,通過java.util. EventObject來描述事件,通過java.util. EventListener來描述事件監(jiān)聽器,在眾多的框架和組件中,建立一套事件機制通常是基于這兩個接口來進行擴展。
在一個事件體系中,有以下幾個重要的概念。
1、事件源:事件對象的產(chǎn)生者,任何一個EventObject都有一個來源
2、事件監(jiān)聽器注冊表:當事件框架或組件收到一個事件后,需要通知所有相關(guān)的事件監(jiān)聽器來進行處理,這個時候就需要有個存儲監(jiān)聽器的地方,也就是事件監(jiān)聽器注冊表。
3、事件廣播器:事件廣播器在整個事件機制中扮演一個中介的角色,當事件發(fā)布者發(fā)布一個事件后,就需要通過廣播器來通知所有相關(guān)的監(jiān)聽器對該事件進行處理。
下圖就是事件機制的結(jié)構(gòu)圖下載
Spring事件發(fā)布機制
在Spring中,事件機制大概也是這么個結(jié)構(gòu),具體的實現(xiàn)采用觀察者模式。下面我們來看看Spring的事件機制設(shè)計類圖下載
1、ApplicationEventPublisher是Spring的事件發(fā)布接口,事件源通過該接口的pulishEvent方法發(fā)布事件。
2、ApplicationEventMulticaster就是Spring事件機制中的事件廣播器,它默認提供一個SimpleApplicationEventMulticaster實現(xiàn),如果用戶沒有自定義廣播器,則使用默認的。它通過父類AbstractApplicationEventMulticaster的getApplicationListeners方法從事件注冊表中獲取事件監(jiān)聽器,并且通過invokeListener方法執(zhí)行監(jiān)聽器的具體邏輯
3、ApplicationListener就是Spring的事件監(jiān)聽器接口,所有的監(jiān)聽器都實現(xiàn)該接口,本圖中列出了典型的幾個子類。其中RestartApplicationListnener在SpringBoot的啟動框架中就有使用下載
4、在Spring中通常是ApplicationContext本身擔任監(jiān)聽器注冊表的角色,在其子類AbstractApplicationContext中就聚合了事件廣播器ApplicationEventMulticaster和事件監(jiān)聽器ApplicationListnener,并且提供注冊監(jiān)聽器的addApplicationListnener方法。
通過上圖就能較清晰的知道當一個事件源產(chǎn)生事件時,它通過事件發(fā)布器ApplicationEventPublisher發(fā)布事件,然后事件廣播器ApplicationEventMulticaster會去事件注冊表ApplicationContext中找到事件監(jiān)聽器ApplicationListnener,并且逐個執(zhí)行監(jiān)聽器的onApplicationEvent方法,從而完成事件監(jiān)聽器的邏輯。