1. 程式人生 > >5.1. ApplicationContext的事件機制

5.1. ApplicationContext的事件機制

ApplicationContext事件機制是觀察者設計模式的實現,通過ApplicationEvent類和ApplicationListener介面,可以實現ApplicationContext事件處理。如果容器中有一個ApplicationListener Bean,每當ApplicationContext釋出ApplicationEvent時,ApplicationListener Bean將自動被觸發。

Spring的事件框架有如下兩個重要的成員:
1. ApplicationEvent:容器事件,必須由ApplicationContext釋出
2. ApplicationListener:監聽器,可由容器中的任何監聽器Bean擔任

提示 :觀察者模式和委託事件模型的介紹和例子請點這裡

實際上,Spring的事件機制與所有時間機制都基本相似,它們都由事件源事件事件監聽器組成。只是此處的事件源是ApplicationContext,且事件必須由Java程式顯式觸發

//程式先定義了一個ApplicationEvent類 繼承自ApplicationEvent
public class EmailEvent extends ApplicationEvent {
    private String address;
    private String text;

    public EmailEvent(Object source, String address, String text) {
        super
(source); this.address = address; this.text = text; } public EmailEvent(Object source) { super(source); } // getter and setter ... }

只要一個類繼承了ApplicationEvent基類,則這個物件就可以作為spring容器的事件。

容器事件的監聽器類必須實現ApplicationListener介面,實現onApplicationEvent(ApplicationEvent event)

方法,每當容器發生任何事件時,此方法都會被觸發。

public class EmailNotifier implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof EmailEvent) {
            EmailEvent emailEvent = (EmailEvent) event;
            System.out.println("郵件地址:" + emailEvent.getAddress());
            System.out.println("郵件內容:" + emailEvent.getText());
        } else {
            System.out.println("其他事件:" + event);
        }

    }
}

注意:spring4.2之後支援使用@EventListener註解來標識監聽方法。可以不實現現ApplicationListener.

public class EmailNotifier {
    @EventListener
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof EmailEvent) {
            EmailEvent emailEvent = (EmailEvent) event;
            System.out.println("郵件地址:" + emailEvent.getAddress());
            System.out.println("郵件內容:" + emailEvent.getText());
        } else {
            System.out.println("其他事件:" + event);
        }

    }
}

將監聽器配置在容器中,spring容器會把這個bean當成 容器事件的監聽器。

<bean class="com.erick.d1.hello.EmailNotifier"/>

當系統建立spring容器,載入spring容器時會自動出發一些容器事件,容器事件監聽器可以監聽到這些事件。

程式也可以呼叫ApplicationContextpublishEvent()方法來主動出發容器事件。

//建立ApplicationEvent物件
EmailEvent event = new EmailEvent("test", "[email protected]", "this is test");
//釋出容器事件
ctx.publishEvent(event);

注意:如果Bean想釋出事件,則Bean必須獲得其容器的引用。如果程式中沒有直接獲取容器的引用,則應該讓Bean實現ApplicationContextAware或者BeanFactoryAware介面,從而可以獲得容器的引用。

Spring提供如下幾個內建事件:

  • ContextRefreshedEventApplicationContext容器初始化或重新整理時觸發該事件。此處的初始化是指:所有的Bean被成功裝載,後處理Bean被檢測並激活,所有Singleton Bean 被預例項化,ApplicationContext容器已就緒可用

  • ContextStartedEvent:當使用ConfigurableApplicationContext(ApplicationContext的子介面)介面的start()方法啟動ApplicationContext容器時觸發該事件。容器管理生命週期的Bean例項將獲得一個指定的啟動訊號,這在經常需要停止後重新啟動的場合比較常見

  • ContextClosedEvent:當使用ConfigurableApplicationContext介面的close()方法關閉ApplicationContext時觸發該事件

  • ContextStoppedEvent:當使用ConfigurableApplicationContext介面的stop()方法使ApplicationContext容器停止時觸發該事件。此處的停止,意味著容器管理生命週期的Bean例項將獲得一個指定的停止訊號,被停止的Spring容器可再次呼叫start()方法重新啟動

  • RequestHandledEvent:Web相關事件,只能應用於使用DispatcherServlet的Web應用。在使用Spring作為前端的MVC控制器時,當Spring處理使用者請求結束後,系統會自動觸發該事件。

  • RequestHandledEvent:Web相關事件,只能用於DispatcherServlet的web應用中。在使用Spring作為前端MVC控制器時,當Spring處理請求結束後,系統會自動觸發該事件。

Spring 4.0.3之後spring還增加了 SessionConnectedEvent SessionConnectEvent SessioonDisconnectEvent 這三個事件,他們都用於為Spring新增的WebSocket功能服務。

相關推薦

5.1. ApplicationContext事件機制

ApplicationContext事件機制是觀察者設計模式的實現,通過ApplicationEvent類和ApplicationListener介面,可以實現ApplicationContext事件處理。如果容器中有一個ApplicationListen

1. java事件機制包括哪三個部分?分別介紹。

java事件機制包括三個部分:事件、事件監聽器、事件源。 1、事件。一般繼承自java.util.EventObject類,封裝了事件源物件及跟事件相關的資訊。 com.javaedu.event.CusEvent類 Java程式碼 1. packag

jQuery 事件機制原始碼分析1——jQuery事件機制整體架構

之前在網上搜索過一些內容大多都是寫的零散寫出一些方法感覺不是很系統,要不就是文不對題,後來自己debug 一番大概搞清楚了,決定寫個文章記錄下來。 需要說明的有以下幾點: 1 本文不會教你如何使用.on .off .trigger 等方法  2  基於原始碼分析基於

Laravel 5.1 定義事件事件監聽器以及觸發事件例項教程

今天我們開始講Laravel的事件,事件無處不在,比如使用者登入、購買商品、搜尋、檢視文章,等等,都是事件,有了事件,就有事件監聽器,事件監聽器監聽到事件發生後會執行一些操作,Laravel使用觀察者模式來實現這種監聽機制。本節我們通過一個簡單的示例來講述在Laravel中

Spring---ApplicationContext事件機制

ApplicationContext的事件機制簡介 1,事件源:ApplicationContext.publishEvent()方法:用於主動觸發容器事件。 2,事件:ApplicationEvent類,容器事件,必須由ApplicationContext釋出。(實際

Spring進階之路(2)-ApplicationContext容器以及事件機制

Spring容器最基本的介面是BeanFactory,他負責配置、建立、管理bean,他的子介面之一:ApplicationContext,也叫做spring的上下文。ApplicationConte

Spring中ApplicationContext事件機制

ApplicationContext事件機制是觀察者設計模式的 實現,通過ApplicationEvent類和ApplicationListener介面,可以實現ApplicationContext事件

Laravel 5.1 中的異常處理器和HTTP異常處理 abort()

錯誤日誌 exce ant upload 記錄 再次 .org splay don 原文 http://laravelacademy.org/post/1867.html 錯誤和異常是處理程序開發中不可回避的議題,在本地開發中我們往往希望能捕獲程序拋出的異常並將其顯示打印

C#內置的事件機制和Unity3D姻緣

mono 需要 listen 存在 logs sharp strong 關聯 有一種 最近因為項目,也因為一些其他事情而導致學習的停止,抽個空來記錄下C#內置的事件在Unity3D中的使用。 我需要讓一個物體對鼠標懸停做出事件的響應的情況下,我們通常會創建一個繼承Mon

mac下配置phonegap(cordova)5.1.1開發環境

ice npm安裝 ont plugin ejs 終端 orm 點擊 add 眼下最新的cordova的版本號是5.1.1,在mac下搭建開發環境過程例如以下: 1)首先安裝NODEJS環境 進入官網: http://nodejs.org/ 。眼下的版本號: v0.1

VirtualBox-5.1.22​無法掛載u盤解決辦法

virtualbox無法掛載u盤解決辦法W10環境下 VirtualBox-5.1.22裝WIN7無法掛載U盤.。VirtualBox-5.1.22可能還需要安裝擴展插件(我裝了),地址如下http://download.virtualbox.org/virtualbox/5.1.22/Oracle_VM_V

node.js零基礎詳細教程(4):node.js事件機制、node異步IO操作

nod server nbsp node i++ 兩個 con 錯誤 定時器 第四章 建議學習時間3小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏

用for和while循環求e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

主函數 int class urn log emp art print tracking /*編敲代碼,依據下面公式求e的值。要求用兩種方法計算: 1)for循環。計算前50項 2)while循環,直至最後一項的值小於10-4 e=1+1/1!+1/2!+1/

USACO 5.1.1凸包

blog n) pre pos blank ace stdin href sqrt 轉自:http://blog.csdn.net/cnyali/article/details/50097593 程序: #include <iostream> #includ

OAuth2.0學習(5-1)新浪開放平臺-微博OAuth2.0認證

com blank weibo mage pen auth 平臺 target img http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 OAuth2.0學習(5-1)新浪開放平臺-微博OAuth2.0認證

5.1 保存鍵值集

note pre 實現 con android 共享 如果 讀寫 per 如果您有想要保存的相對較小鍵值集合,您應使用 SharedPreferences API。SharedPreferences 對象指向包含鍵值對的文件並提供讀寫這些文件的簡單方法。 每個 Shared

PHP實現事件機制實例分析

word-wrap [0 popu except switch targe att otto 對象 PHP實現事件機制實例分析 內置了事件機制的語言不多,php也沒有提供這種功能。事件(Event)說簡單了就是一個Observer模式。實現起來非常ea

5.1 編程語言的基元類型

屬性 long 測試 byte 發生 代碼 arr dsi 算數運算 編譯器直接支持的數據類型成為基元類型(primitive type)。基元類型直接映射到 Framework類庫(FCL)中存在的類型。 int a = 0; // Most convenient

5-1 Maximum Subsequence Sum (25分)

eth rst line input tin 無奈 ati scan scripts Given a sequence of KK integers { N_1N?1??, N_2N?2??, ..., N_KN?K?? }. A continuous subsequenc

使用percona-xtrabackup-2.0.8將MySQL從5.1.73升級到5.6.36

xtrabackup1、安裝xtrabackupcd /usr/local/tar xvf percona-xtrabackup-2.0.8-587.tar.gzmv percona-xtrabackup-2.0.8 xtrabackupvim /root/.bash_profile PATH=$PATH:$