Hello,你們好,前面幾篇Spring的文章把Spring容器這一塊大體分享完了,容器的建立,容器裏的Bean,後面一篇文章會好好的講一講AOP,這一篇來點小菜吃吃,講個Spring的容器事件,這個知識不是很經常使用。爲何呢?由於通常稍微大型一點的系統都是分佈式的,不會採用局部項目中的通信,要通信也是採用MQ,但既然寫了Spring系列的博客,仍是和你們分享分享。OK,老討論,文章結構:java
談到事件,其實不少框架組件都自帶事件機制,宏觀上講,JDK裏的notify其實也算是事件,可以通知wait的線程。這裏給你們來一張圖,而後直接切入主題的講Spring裏的內置事件: bash
好了,其實很是簡單,而後給一下Spring內部的Spring事件繼承圖: 架構
Spring內部全部的事件都是繼承自ApplicationEvent, 內置的事件有ContextClosedEvent,ContextRefreshEvent,ContextStartedEvent,ContextStoppedEvent和ServletRequestHandledEvent.分別表示容器啓動,關閉,刷新,停止的事件和一次請求服務完成的事件。而後給一個例子演示內置事件:app
public class ContextStopListener implements ApplicationListener<ContextStoppedEvent>{
public void onApplicationEvent(ContextStoppedEvent event) {
System.out.println("ContextStoppedEvent Received");
}
}
複製代碼
直接把這個類注入到Spring中成爲Bean便可。容器關閉時,就會調用onApplicationEvent...框架
上面能夠看到,內置的事件,咱們只須要自定義一個Listener放入Spring容器便可。那麼要是自定義的事件呢,來看一個例子:分佈式
public class ZdyEvent extends ApplicationEvent {
private String whatsHasspend;
public ZdyEvent(Object source,String whatsHasspend) {
super(source);
this.whatsHasspend=whatsHasspend;
}
public String getWhatsHasspend() {
return whatsHasspend;
}
public void setWhatsHasspend(String whatsHasspend) {
this.whatsHasspend = whatsHasspend;
}
}
public class ZdyListener implements ApplicationListener<ZdyEvent> {
@Override
public void onApplicationEvent(ZdyEvent zdyEvent) {
System.out.println("事件接收器接收到了Event:"+zdyEvent.getWhatsHasspend());
}
}
複製代碼
而後咱們的Main:ide
public static void main( String[] args ) {
ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
ZdyEvent event =new ZdyEvent(ac,"我發送了一個事件:我吃了一個蘋果..");
ac.publishEvent(event);
}
複製代碼
打印:this
事件接收器接收到了Event:我發送了一個事件:我吃了一個蘋果..
複製代碼
注意,定義完事件和時間監聽器後,須要把事件監聽器(ZdyListener)放入到容器當中。而咱們的事件類(ZdyEvent)是不用放入到容器中的.spa
好了,其實前面已經提到過,Spring的事件機制厲害是厲害,但只停留的當前工程的Spring模塊中,首先不適合集羣,其次不適合分佈式。因此,說白了,是個花架子。你們僅供瞭解。不管是集羣仍是分佈式的通信,確定是不會用這個東東,通常都是Mq,zk,kafka這類分佈式組件,作過系統架構的應該比較清楚。本文也是順帶的提了提,大體說了說。Over,Have a good day .線程