1. 程式人生 > >Spring中使用ApplicationContext進行事件的監聽之ApplicationEvent,ApplicationListener

Spring中使用ApplicationContext進行事件的監聽之ApplicationEvent,ApplicationListener

spring的ApplicationEvent的使用

    Spring 3.0中提供了很多類似*Aware的類,其中ApplicationContextAware介面可以實現我們在初始化bean的時候給bean注入ApplicationConxt(Spring上下文物件)物件。ApplicationContextAware介面提供了publishEvent方法,實現了Observe(觀察者)設計模式的傳播機制,實現了對bean的傳播。通過ApplicationContextAware我們可以把系統中所有ApplicationEvent傳播給系統中所有的ApplicationListener。因此,我們只需要構造好我們自己的ApplicationEvent和ApplicationListener,就可以在系統中實現相應的監聽器。

   下面以增加學生的示例來演示如何構造Spring的監聽器,StudentAddEvent是監聽的事件物件,StudentAddListener是事件的監聽器(負責處理接收到的監聽事件),StudentAddBean負責觸發StudentAddEvent事件。具體步驟如下:

1.  定義StudentAddEvent監聽事件

新建StudentAddEvent類,實現抽象類

org.springframework.context.ApplicationEvent

StudentAddEvent類中需要實現自己的建構函式,具體程式碼如下:

  1. package com.trs.spring.event;  
  2. import org.springframework.context.ApplicationEvent;  
  3. /** 
  4.  * 增加學生的監聽事件 
  5.  */
  6. publicclass StudentAddEvent extends ApplicationEvent {  
  7.     /** 
  8.      *  
  9.      */
  10.     privatestaticfinallong serialVersionUID = 20L;  
  11.     /** 
  12.      * 學生姓名 
  13.      */
  14.     private String m_sStudentName;  
  15.     /** 
  16.      * @param source
     
  17.      */
  18.     public StudentAddEvent(Object source, String _sStudentName) {  
  19.         super(source);  
  20.         this.m_sStudentName = _sStudentName;  
  21.     }  
  22.     /** 
  23.      * 獲取學生姓名 
  24.      *  
  25.      * @return 
  26.      */
  27.     public String getStudentName() {  
  28.         return m_sStudentName;  
  29.     }  
  30. }  

2.  定義StudentAddListener監聽器

新建StudentAddListener類,實現介面

org.springframework.context.ApplicationListener

中的onApplicationEvent方法,在該方法中只處理StudentAddEvent型別的ApplicationEvent事件,程式碼如下:

  1. package com.trs.spring.event;  
  2. import org.springframework.context.ApplicationEvent;  
  3. import org.springframework.context.ApplicationListener;  
  4. publicclass StudentAddListener implements ApplicationListener {  
  5. /* 
  6.      * (non-Javadoc) 
  7.      *  
  8.      * @see 
  9.      * org.springframework.context.ApplicationListener#onApplicationEvent(org 
  10.      * .springframework.context.ApplicationEvent) 
  11.      */
  12. publicvoid onApplicationEvent(ApplicationEvent _event) {  
  13. // 1.判斷是否是增加學生物件的事件 
  14. if (!(_event instanceof StudentAddEvent)) {  
  15. return;  
  16.         }  
  17. // 2.是增加學生事件的物件,進行邏輯處理,比如記日誌、積分等
  18.         StudentAddEvent studentAddEvent = (StudentAddEvent) _event;  
  19.         System.out.println("增加了學生:::" + studentAddEvent.getStudentName());  
  20.     }  
  21. }  

3.  定義StudentAddBean觸發StudentAddEvent事件

新建StudentAddBean類,實現介面

org.springframework.context.ApplicationContextAware

中的setApplicationContext方法,在構造bean的時候注入Spring的上下文物件,以便通過Spring上下文物件的publishEvent方法來觸發StudentAddEvent事件,具體程式碼如下;

  1. package com.trs.spring.event;  
  2. import org.springframework.beans.BeansException;  
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.ApplicationContextAware;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6. publicclass StudentAddBean implements ApplicationContextAware {  
  7.     /** 
  8.      * 定義Spring上下文物件 
  9.      */
  10.     private ApplicationContext m_applicationContext = null;  
  11.     /* 
  12.      * (non-Javadoc) 
  13.      *  
  14.      * @see 
  15.      * org.springframework.context.ApplicationContextAware#setApplicationContext 
  16.      * (org.springframework.context.ApplicationContext) 
  17.      */
  18.     publicvoid setApplicationContext(ApplicationContext _applicationContext)  
  19.             throws BeansException {  
  20.         this.m_applicationContext = _applicationContext;  
  21.     }  
  22.     /** 
  23.      * 增加一個學生 
  24.      *  
  25.      * @param _sStudentName 
  26.      */
  27.     publicvoid addStudent(String _sStudentName) {  
  28.         // 1.構造一個增加學生的事件
  29.         StudentAddEvent aStudentEvent = new StudentAddEvent(  
  30.                 m_applicationContext, _sStudentName);  
  31.         // 2.觸發增加學生事件
  32.         m_applicationContext.publishEvent(aStudentEvent);  
  33.     }  
  34.     /** 
  35.      * @param args 
  36.      */
  37.     publicstaticvoid main(String[] args) {  
  38.         String[] xmlConfig = new String[] { "applicationContext.xml" };  
  39.         // 使用ApplicationContext來初始化系統
  40.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  41.                 xmlConfig);  
  42.         StudentAddBean studentBean = (StudentAddBean) context  
  43.                 .getBean("StudentAddBean");  
  44.         studentBean.addStudent("我是第一個學生");  
  45.         studentBean.addStudent("第二個學生已經新增");  
  46.     }  
  47. }  

4.  applicationContext.xml配置檔案

<bean id="StudentAddBean" class="com.trs.spring.event.StudentAddBean"></bean>

<bean id="StudentAddListener" class="com.trs.spring.event.StudentAddListener"></bean>

5.  說明

ApplicationContext在執行期會自動檢測到所有實現了ApplicationListener的bean物件,並將其作為事件接收物件。當ApplicationContext的publishEvent方法被觸發時,每個實現了ApplicationListener介面的bean都會收到ApplicationEvent物件,每個ApplicationListener可根據事件型別只接收處理自己感興趣的事件,比如上面的StudentAddListener只接收StudentAddEvent事件。

6.  執行StudentAddBean的main函式,結果如下:

增加了學生:::我是第一個學生

增加了學生:::第二個學生已經新增