天天看點

spring中自定義Event事件的使用和淺析

在我目前接觸的項目中,用到了許多spring相關的技術,架構層面的spring、spring mvc就不說了,細節上的功能也用了不少,如schedule定時任務、filter過濾器、 interceptor攔截器等等,而這一篇我要說的是spring event自定義事件,目前的項目中似乎沒怎麼用,但是這一項技術貌似還蠻重要,是以也不能不掌握。

對于事件驅動模型的解釋和了解,我覺得有一篇部落格裡說的非常好,尤其是在解釋這個關系的時候,舉的交通信号燈的例子非常貼切,這裡就引用做一個簡單的解釋:

事件驅動模型也就是我們常說的觀察者,或者釋出-訂閱模型;了解它的幾個關鍵點:

首先是一種對象間的一對多的關系;最簡單的如交通信号燈,信号燈是目标(一方),行人注視着信号燈(多方);

當目标發送改變(釋出),觀察者(訂閱者)就可以接收到改變;

觀察者如何處理(如行人如何走,是快走/慢走/不走,目标不會管的),目标無需幹涉;是以就松散耦合了它們之間的關系。

當我們對事件驅動有一個簡單的了解之後,就能大概知道它應該什麼時候用,然後再來研究它該怎麼用,單一的文字或許不太容易解釋,還是先把代碼弄上來,然後再結合起來解釋。

首先自定義一個事件,需要繼承applicationevent類,相當于安裝了一個沒有通電,沒有燈光的信号燈,需要具有信号燈的基本特征。

然後再建立一個監聽類,相當于行人(不管是否使用交通工具),需要實作applicationlistener接口,并且重寫onapplicationevent方法,可以了解成這個行人需要看信号燈,并且能了解信号燈的意思才行。否則不看信号燈跟沒有信号燈沒有差別,看了不了解也沒用。

這裡的注解就隻是簡單的聲明一個bean,應該不需要太多的解釋。

那麼第三步自然是需要一個控制信号燈變化的東西,相當于是給他接好電線,給他一個正常變換紅黃綠的程式和電路。

到這裡,實際上已經寫完了,但是呢很明顯,我們合理沒有配置檔案,那麼這裡的注解也是不能被spring使用的,純粹是個擺設,是以還需要一個配置檔案,或者說相當于配置檔案的配置類,要讓相關的類生效。

對于這裡兩個注解的意思,前幾天的文章曾多次解釋,是以這裡便不說了,真有不懂得,可以翻一下前幾天的部落格。

走到這裡,相當于我們建立好了一個可以正常運作的信号燈,建立好了一個正常的行人,但是呢都是靜止不動的,我們需要讓他動起來,也就是main方法的測試,相當于讓行人開始看燈,讓電路開始通電。

運作main方法後結果如下:

spring中自定義Event事件的使用和淺析

根據上邊的代碼可以知道代表這個事件正常運作了,也就是信号燈正常發出了光,行人正常接收到了消息。

那麼還有一個細節在于,信号燈對行人,是一對多的關系,那麼這裡的事件是否确實如此呢?為了驗證,我便再寫一個監聽,再new一個行人,其他一切不變。

再次運作main方法,結果如下:‘

spring中自定義Event事件的使用和淺析

很明顯,兩個行人都正常接收到了信号燈的信号。

那麼,根據上邊一開始的解釋,再加上之後的例子,我們應該大概知道了這裡的一個完整的事件包含些什麼内容:即要有目标,也就是一個事件;還要有接受目标資訊的對象,也就是一種監聽;還要有改變或者說發出資訊的一個控制體。

到這裡基本上就算是完工了,這算是最簡單的實作方式,像一些細節上的,把配置類改配置檔案等等,都可以自己适當的變型。

在結尾處,結合@propertysource注解,我把上邊的列子做了個小小的變型,模拟一個找人的廣播,喊一個人的名字,然後聽到的人進行相應的回答。

這個例子和上邊的不同在于,增加了一個properties配置,用來給接收對象初始化名稱,順便練習@propertysource注解。

然後修改了一下監聽類,從properties檔案中擷取自己的名字。

其中propertyconfigure()是必須的,隻有寫了這個才能正産剛從properties中擷取資料,但是經過測試,這一段代碼隻需要有一個地方出現了就可以,是以第二個監聽類就不用再寫:

在運作之前的main方法後,結果如下:

spring中自定義Event事件的使用和淺析

這個例子已經打包上傳,有興趣的可以看看,其中隻有springtest5這個包裡是這個例子,其他幾個包裡的内容則是對前幾天的博文中對profile等技術點的練習,有興趣的也可以看看。

<a href="http://download.csdn.net/detail/tuzongxun/9711034">http://download.csdn.net/detail/tuzongxun/9711034</a>