spring學習(六):容器事件

事件體系其實是觀察者模式的一種具體實現方式
Spring的 ApplicationContext能夠發佈事件並允許註冊相應的事件監聽器,是因爲他擁有一套完善的事件發佈與監聽機制。

一、java中的事件機制實現

通過java.util.EventObjectjava.util.EventLinister接口描述事件和監聽器。某個組件或框架如需事件發佈和 監聽機制,都需要通過拓展它們進行定義。在事件體系中,除了事件和監聽器之外,還有另外三個重要的概念:

  1. 事件源:事件的產生者,任何一個EventObjecct(事件)都必須有一個事件源
  2. 事件監聽器註冊表:提供保存事件監聽器的地方,一個事件監聽器註冊到組件或框架後,其實就是保存在事件監聽器註冊表中。當組件和框架中的事件源產生消息時,就會通知這些位於事件監聽註冊器中的監聽器
  3. 事件廣播器:他是事件和事件監聽器之間的橋樑,負責把事件通知給事件監聽器

事件源、事件監聽器註冊表和事件廣播器這三個角色有時可以用同一對象來承擔,如java.swing包中的JButton,JCheckBox等。

二、spring的事件類結構

結構圖如下所示:

ApplicationEvent的唯一構造函數是ApplicationEvent(Object source),通過source指定事件源,它有兩個子類

  • ApplicationContextEvent:容器事件,它擁有四個子類,分別表示容器啓動,刷新,停止和關閉的事件
  • RequestHandleEvent:這是一個與web應用相關的事件,當一個HTTP請求被處理後,產生該事件。只有在web.xml中定義了DispatcherServlet時纔會產生該事件。它擁有兩個子類,分別代表servlet及portlet請求事件

三、事件監聽器結構

spring的事件監聽器都繼承自ApplicationListener,結構如下:

ApplicationListener只定義了一個方法,onApplicationEvent(E event),該方法接受ApplicationEvent對象,在該方法中編輯事件響應的邏輯

四、事件廣播器

另外的,事件廣播器要擁有發佈事件的能力,就必須實現ApplicationContextAware接口

五、解構spring事件體系的具體實現

Spring在ApplicationContext接口的抽象實現類AbstractApplicationContext中完成事件體系的搭建。在refresh()方法中通過三個步驟搭建了事件的基礎設施

  • 首先在5處,Spring初始化事件廣播器,只要實現ApplicationEventMulticaster即可,spring通過反射機制將其註冊成事件廣播器,如果沒有找到配置的自定義事件廣播器,spring會使用默認的SimpleApplicationEventMulticaster作爲事件廣播器
  • 在7處,Spring根據反射機制從BeanDefinitionRegistry中找到所有實現了ApplicationListener的bean,將他們註冊爲容器的事件監聽器,即添加到事件廣播器提供的事件監聽器註冊表中
  • 在9處,容器啓動完成,調用事件發佈接口向容器中所有的監聽器發送事件,在publishEvent()方法中可以看到,Spring委託ApplicationContextMulticaster將事件通知給事件監聽器

至此,spring事件體系全部完成。後期會附一個實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章