Spring核心系列之容器事件

我又不是架構師發表於2018-01-09

Spring核心系列之容器事件

Hello,大家好,前面幾篇Spring的文章把Spring容器這一塊大致分享完了,容器的建立,容器裡的Bean,後面一篇文章會好好的講一講AOP,這一篇來點小菜吃吃,講個Spring的容器事件,這個知識不是很常用。為什麼呢?因為一般稍微大型一點的系統都是分散式的,不會採用區域性專案中的通訊,要通訊也是採用MQ,但既然寫了Spring系列的部落格,還是和大家分享分享。OK,老討論,文章結構:

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

1. Spring中的內建事件

談到事件,其實很多框架元件都自帶事件機制,巨集觀上講,JDK裡的notify其實也算是事件,能夠通知wait的執行緒。這裡給大家來一張圖,然後直接切入主題的講Spring裡的內建事件:

Spring核心系列之容器事件

  • 事件源,具體到Spring中就是ApplicationContext了。
  • 事件,內建事件或者自己定義實現(實現ApplicationEvent介面來實現)。
  • 事件廣播器: Spring自己實現,我們不關心。
  • 事件監聽器登錄檔: Spring自己實現,我們不關心。
  • 監聽器: 開發者實現,注入到Spring容器中就OK了。(實現AoolicationListener介面來實現)

好了,其實非常簡單,然後給一下Spring內部的Spring事件繼承圖:

Spring核心系列之容器事件
Spring內部所有的事件都是繼承自ApplicationEvent, 內建的事件有ContextClosedEvent,ContextRefreshEvent,ContextStartedEvent,ContextStoppedEvent和ServletRequestHandledEvent.分別表示容器啟動,關閉,重新整理,中止的事件和一次請求服務完成的事件。

然後給一個例子演示內建事件:

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:

    public static void main( String[] args )
    {

        ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
        ZdyEvent event =new ZdyEvent(ac,"我傳送了一個事件:我吃了一個蘋果..");
        ac.publishEvent(event);
    }
複製程式碼

列印:

事件接收器接收到了Event:我傳送了一個事件:我吃了一個蘋果..
複製程式碼

注意,定義完事件和時間監聽器後,需要把事件監聽器(ZdyListener)放入到容器當中。而我們的事件類(ZdyEvent)是不用放入到容器中的.

結語

好了,其實前面已經提到過,Spring的事件機制厲害是厲害,但只停留的當前工程的Spring模組中,首先不適合叢集,其次不適合分散式。所以,說白了,是個花架子。大家僅供瞭解。無論是叢集還是分散式的通訊,肯定是不會用這個東東,一般都是Mq,zk,kafka這類分散式元件,做過系統架構的應該比較清楚。本文也是順帶的提了提,大致說了說。Over,Have a good day .

相關文章