java 觀察者、事件機制和Spring 事件分發(fā) 精華一頁紙

事件處理一般都采用類似觀察者模式, java util自帶了觀察者模式的接口

1、觀察者模式接口

關(guān)于觀察者這個模式, 可以參見本博《設計模式 精華一頁紙》, JDK 提供的這個接口, 可以方便的進行開發(fā)

java.util.Observable -- 事件發(fā)布者 (目標)

java.util.Observer -- 事件監(jiān)聽者 (觀察者)

2、事件處理接口

EventObject - 事件對象

EventListener - 事件監(jiān)聽對象

接口雖然簡單, 但java的事件都是基于如上的接口, 比如典型 GUI 的awt事件

要完成一個完整的事件模型 就需要結(jié)合 觀察者模式 + 事件處理接口,即包含三個部分:事件、事件發(fā)布者、監(jiān)聽者

3、Spring 的事件派發(fā)模型

事件 ApplicationEvent -> 繼承 EventObject

監(jiān)聽者 ApplicationListener -> 繼承 EventListener

事件管理者/發(fā)布者 ApplicationEventPublisher | ApplicationEventMulticaster, 這是JDK 事件未提供的模塊

I、實例

a、事件

public class LogEvent extends ApplicationEvent{

public LogEvent(Log source) {

super(source);

}

@Override

public Log getSource(){

return (Log)super.getSource();

}

}

b、監(jiān)聽者

public class LogListener implements ApplicationListener{

@Override

public void onApplicationEvent(LogEvent event) {

System.out.println("get event : " + event.getSource());

}

}

c、事件發(fā)布者

public class LogPublisher implements ApplicationEventPublisher{

private List> listeners = new LinkedList>();

@Override

public void publishEvent(ApplicationEvent event) {

for(ApplicationListener listener : listeners)

listener.onApplicationEvent(event);

}

public void addListener(ApplicationListener listener){

listeners.add(listener);

}

}

應用

noSpring

ApplicationEvent event = new LogEvent(log);

ApplicationListener listener = new LogListener();

LogPublisher pub = new LogPublisher();

pub.addListener(listener);

pub.publishEvent(event);

Spring

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");

context.addApplicationListener(listener);

context.publishEvent(event);

II、Spring的體系

常用的事件

事件發(fā)布者/管理者

ApplicationEventPublisher

ApplicationEventMulticaster

-- AbstractApplicationContext

-- XXXApplicationContext

監(jiān)聽者

ApplicationListener

SmartApplicationListener -- 可以支持按順序調(diào)用

III、增強調(diào)用(結(jié)合 Spring 任務調(diào)度機制)

因為Spring 觀察者模式采用的是 推的方式,所以 如果某個任務執(zhí)行很慢, 就會卡住, 所以Spring提供了異步調(diào)用的機制, SimpleApplicationEventMulticaster, 通知任務都是以異步方式執(zhí)行

默認情況下,如果有配置的 applicationEventMulticaster, 按照約定的默認名稱獲取發(fā)布者, 如果沒有 代碼自動new一個 發(fā)布者。這種默認值是 很多配置框架的一個原則-- 約定優(yōu)于配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 本文包括:1、Listener簡介2、Servlet監(jiān)聽器3、監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4、監(jiān)聽三個域?qū)?..
    廖少少閱讀 6,653評論 6 28
  • 說到十年,耳邊總能想起一首熟悉的旋律,陳奕迅的《十年》。 十年之前 我不認識你 你不屬于我十年之后 我們是朋友 還...
    周大漁可持續(xù)發(fā)展閱讀 473評論 3 0

友情鏈接更多精彩內(nèi)容