Spring注解驅(qū)動(dòng)之@EventListener注解使用方式_第1頁
Spring注解驅(qū)動(dòng)之@EventListener注解使用方式_第2頁
Spring注解驅(qū)動(dòng)之@EventListener注解使用方式_第3頁
Spring注解驅(qū)動(dòng)之@EventListener注解使用方式_第4頁
Spring注解驅(qū)動(dòng)之@EventListener注解使用方式_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Spring注解驅(qū)動(dòng)之@EventListener注解使用方式目錄概述@EventListener注解的用法@EventListener注解的原理

概述

之前我們說過可以通過實(shí)現(xiàn)ApplicationListener接口來監(jiān)聽處理事件。

其實(shí)還有一種注解方式來監(jiān)聽處理事件。即使用@EventListener注解,通過該注解就可以在方法上監(jiān)聽事件了。

這樣普通的業(yè)務(wù)邏輯組件中就可以直接使用這個(gè)注解來監(jiān)聽事件了,無需實(shí)現(xiàn)ApplicationListener接口了,確實(shí)比較方便,但是其原理是和ApplicationListener接口一樣的,也可以自定義一個(gè)多波器實(shí)現(xiàn)異步監(jiān)聽事件,定義方法與之前一致。Spring注解驅(qū)動(dòng)之ApplicationListener異步處理事件

@EventListener注解的用法

首先,編寫一個(gè)普通的業(yè)務(wù)邏輯組件,例如UserService,并在該組件上標(biāo)注一個(gè)@Service注解。

我們只需要簡(jiǎn)單的在該方法上標(biāo)注一個(gè)@EventListener注解,就可以讓方法來監(jiān)聽事件了??梢酝ㄟ^注解的classes屬性來指定需要監(jiān)聽的事件。

例如,我們可以讓listen方法監(jiān)聽ApplicationEvent及其子事件。

最后我們?cè)趨?shù)的位置上寫一個(gè)ApplicationEvent參數(shù)來接收事件,參數(shù)值是在Spring框架調(diào)用的時(shí)候自動(dòng)賦值的。

packagecom.meimeixia.ext;

importorg.springframework.context.ApplicationEvent;

importorg.springframework.context.event.EventListener;

importorg.springframework.stereotype.Service;

@Service

publicclassUserService{

//一些其他的方法...

@EventListener(classes=ApplicationEvent.class)

publicvoidlisten(ApplicationEventevent){

System.out.println("UserService...監(jiān)聽到的事件:"+event);

寫個(gè)測(cè)試用例。

packagecom.meimeixia.test;

importorg.junit.Test;

importorg.springframework.context.ApplicationEvent;

importorg.springframework.context.annotation.AnnotationConfigApplicationContext;

importcom.meimeixia.ext.ExtConfig;

publicclassIOCTest_Ext{

@Test

publicvoidtest01(){

AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(ExtConfig.class);

//發(fā)布一個(gè)事件

applicationContext.publishEvent(newApplicationEvent(newString("我發(fā)布的事件")){

//關(guān)閉容器

applicationContext.close();

你會(huì)發(fā)現(xiàn)Eclipse控制臺(tái)打印出了如下內(nèi)容,可以清晰地看到,不僅我們之前編寫的監(jiān)聽器(例如MyApplicationListener)收到了事件,而且UserService組件也收到了事件。

也就是說,每一個(gè)都能正確地收到事件。

@EventListener注解的原理

我們可以點(diǎn)進(jìn)去@EventListener這個(gè)注解里面去看一看,如下圖所示,可以看到這個(gè)注解上面有一大堆的描述,從描述中我們可以猜到這個(gè)注解的內(nèi)部工作原理。

描述中有一個(gè)醒目的字眼,即參考EventListenerMethodProcessor。意思可能是說,如果你想搞清楚@EventListener注解的內(nèi)部工作原理,那么可以參考EventListenerMethodProcessor這個(gè)類。

EventListenerMethodProcessor是一個(gè)處理器,其作用是來解析方法上的@EventListener注解的。

這也就是說,Spring會(huì)使用EventListenerMethodProcessor來解析方法上的@EventListener注解。

因此,搞清楚這個(gè)處理器是怎樣工作的,就搞清楚了@EventListener注解的內(nèi)部工作原理。

仔細(xì)看一下SmartInitializingSingleton接口中afterSingletonsInstantiated方法上面的描述信息,不難看出該方法是在所有的單實(shí)例bean已經(jīng)全部被創(chuàng)建完了以后才會(huì)被執(zhí)行。

在介紹SmartInitializingSingleton接口的時(shí)候,我們也能從描述信息中知道,在所有的單實(shí)例bean已經(jīng)全部被創(chuàng)建完成以后才會(huì)觸發(fā)該接口。緊接著下面一段的描述還說了,該接口的調(diào)用時(shí)機(jī)有點(diǎn)類似于ContextRefreshedEvent事件,即在容器刷新完成以后,便會(huì)回調(diào)該接口。也就是說,這個(gè)時(shí)候容器已經(jīng)創(chuàng)建完了。

如果所有的單實(shí)例bean都已經(jīng)創(chuàng)建完了,也就是說下面這一步都執(zhí)行完了,那么說明IOC容器已經(jīng)創(chuàng)建完成了。

緊接著便會(huì)來調(diào)用finishRefresh方法,容器已經(jīng)創(chuàng)建完了,此時(shí)就會(huì)來發(fā)布容器已經(jīng)刷新完成的事件。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論