Spring核心系列之容器事件

Spring核心系列之容器事件

Hello,你們好,前面幾篇Spring的文章把Spring容器這一塊大體分享完了,容器的建立,容器裏的Bean,後面一篇文章會好好的講一講AOP,這一篇來點小菜吃吃,講個Spring的容器事件,這個知識不是很經常使用。爲何呢?由於通常稍微大型一點的系統都是分佈式的,不會採用局部項目中的通信,要通信也是採用MQ,但既然寫了Spring系列的博客,仍是和你們分享分享。OK,老討論,文章結構:java

  1. Spring中的內置事件
  2. 如何在Spring中自定義事件

1. Spring中的內置事件

談到事件,其實不少框架組件都自帶事件機制,宏觀上講,JDK裏的notify其實也算是事件,可以通知wait的線程。這裏給你們來一張圖,而後直接切入主題的講Spring裏的內置事件: bash

  • 事件源,具體到Spring中就是ApplicationContext了。
  • 事件,內置事件或者本身定義實現(實現ApplicationEvent接口來實現)。
  • 事件廣播器: Spring本身實現,咱們不關心。
  • 事件監聽器註冊表: Spring本身實現,咱們不關心。
  • 監聽器: 開發者實現,注入到Spring容器中就OK了。(實現AoolicationListener接口來實現)

好了,其實很是簡單,而後給一下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...框架

2. 如何在Spring中自定義事件

上面能夠看到,內置的事件,咱們只須要自定義一個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 .線程

相關文章
相關標籤/搜索