JavaEE開發之Spring中的事件發送與監聽以及使用@Profile進行環境切換

本篇博客咱們就來聊一下Spring框架中的觀察者模式的應用,即事件的發送與監聽機制。以前咱們已經剖析過觀察者模式的具體實現,以及使用Swift3.0自定義過通知機制。因此本篇博客對於事件發送與監聽的底層實現就不作過多贅述了。下方會給出Spring中是如何進行事件的發送與監聽的。聊完事件的發送與監聽,咱們再來聊一下如何使用@Profile註解來切換「生產環境」與「開發環境」。html

 

1、Spring中的事件發送與監聽git

Spring中的事件發送與監據說白了就是廣播。由Publisher來發送Event,有Listener來接收EventPublisher和Listenter一對多的關係,當Publisher在發送Event時,並不肯定是哪些Listener會收到該發佈的事件。固然再進一步說,Spring的事件發送與監聽的本質仍是觀察者模式的具體實現。以前的博客咱們拿Swift語言來具體的實現和分析了觀察者模式,關於觀察者模式的具體內容,請移步於《本身動手使用「觀察者模式」實現通知機制》。github

該部分關於「觀察者模式」的東西就不作過多贅述了,主要就來看一下在Spring中是如何使用事件發送以及事件監聽的。框架

 

一、事件發送與監聽的原理圖函數

一直看代碼比較枯燥,那麼咱們就來一張原理圖來看一下Spring框架中的事件發佈者(Publisher)、事件(Event)、監聽者(Listener)之間的關係。上面也提到了,Publisher與Listener之間的關係是一對多的關係。也就是說Publisher發佈Event是經過廣播的形式來實現的。Publisher在發送Event時,並不肯定是那些Listener接收的Event。測試

而Event就是發送消息的載體。也就是說Publisher與Listener之間交流的載體就是Event對象。Publisher發佈Event對象,而Listener則接收Event對象。三者之間的關係具體以下所示:spa

 

 

二、事件發送與監聽的具體實現htm

搞明白上述原理,在給出具體實現就簡單多了。接下來咱們就來看看Spring中是如何來實現上述關係的。對象

(1)、建立Eventblog

由於Event是廣播信息的載體,相似於iOS開發中的NSNotification。因此咱們就先建立Spring框架中的Event。下方的DemoEvent就是咱們建立的事件,固然該事件要繼承ApplicationEvent類。DemoEvent類中的msg屬性就用來承載該事件的信息。而serialVersionUID則表示該事件的標示。具體以下所示:

  

 

(2)、建立Publisher

建立完事件後,接下來咱們就來建立事件的發佈者。下方的DemoPublisher就是咱們建立的發佈事件的類。在類中咱們使用@Autowired註解了ApplicationContext類的注入點。由於咱們要使用ApplicationContext對象的publicEvent()方法來進行推送,而publicEvent()方法的參數就是咱們上面建立DemoEvent事件的對象。以下所示。

  

 

(3)、建立Listener

Event以及Publisher建立完畢後,接下來咱們就來建立接收事件的Listener。咱們能夠建立多個Listener來接收Publisher發佈的Event,下方就咱們就以DemoListener爲例。DemoListener類實現了ApplicationListener接口,而且給出了onApplicationEvent()方法的實現。當收到Publisher發佈的Event時,就會執行下方的onApplicationEvent()方法,而該方法的參數就是咱們建立的DemoEvent事件對象。

由下方截圖不難看出,此處咱們建立了兩個Listener,當上面的Publisher發佈完事件後,這兩個Listener都會收到相應的事件消息。

  

 

(4)、運行並輸出結果

Event、Publisher、Listener建立完畢後,接下來咱們就該測試這三者了。由於咱們所建立的Publisher是Spring管理的Bean(@Component),因此從Spring的容器中獲取Publisher的對象,而後調用public()方法進行事件的發佈。

下方就是咱們測試用的Main方法,而後是消息的輸出。可見,咱們的這個事件的兩個監聽者都收到了來着Publisher的Even。

  

 

 

2、@Profile註解

在Spring框架中,咱們可使用@Profile註解來設置相應的開發環境,如生產環境、準生產環境或者測試環境等。接下來咱們就來看一下@Profile註解的使用方式。固然@Profile註解是在Java配置類中聲明Bean時使用的,下方會給出具體實現。

首先咱們建立一個測試Bean,咱們將該Bean命名爲DemoProfileBean。稍後,咱們將會在Java的配置文件中對該類進行Bean的聲明。下方代碼段比較簡單,在此就不作過多贅述了。

  

 

而後咱們就要來實現咱們的Java配置類了。下方的ProfileConfig就是該部分建立的Java配置文件,在其中咱們聲明瞭兩個Bean。這兩個Bean都是DemoProfileBean類的Bean的聲明。不過建立對象時所提供的參數不一樣。咱們使用@Profile來進行區分,若是@Profile的參數是「develop」,那麼咱們就將DemoProfileBean對象的參數設置成開發環境的IP地址,若是@Profile的參數是「product」的話,那麼所建立的DemoProfileBean的對象的參數就是生產環境的IP地址,具體代碼以下所示。

  

 

建立好上述配置文件後,接下來咱們就該建立測試用的Main函數了。下方就是Main函數的具體內容,下方緊接着是運行效果。能夠看出,咱們指定的Profile的值不一樣,所建立的對象的參數也是不一樣的。具體如所示:

  

 

今天博客就先到這兒吧,github源碼分享地址:https://github.com/lizelu/SpringDemo

相關文章
相關標籤/搜索