Spring監聽事件使用


廢話前言:

首先說一下我為什么使用事件,比如現在創建一個訂單但是我創建成功后要給客戶發送一條短信和一個郵件提醒,本身沒創建訂單一系列操作就需要很多時間但是我還要去發送短信和郵件,期間還要調用其它服務來實現耗時比較長達不到客戶的滿意度,所以使用的方式可以說一下:

1:activeMQ(異步)

2:使用spring事件監聽(同步+異步)

下面我們只說第二種方式

在談Spring的事件監聽之前,讓我們先了解一下Spring容器,什么是ApplicationContext ?
它是Spring的核心,Context我們通常解釋為上下文環境,但是理解成容器會更好些。 
ApplicationContext則是應用的容器。
Spring把Bean(object)放在容器中,需要用就通過get方法取出來。
此接口提供給Spring應用配置的能力,當應用啟動時,此接口的實現是只讀的,但是如果該實現支持,其內容也是可以重新載入的。
ApplicationContext大概提功能如下能力:
1.獲取應用組件的bean工廠方法,此能力繼承自 org.springframework.beans.factory.ListableBeanFactory。
2.加載資源文件的能力,此能力繼承自 org.springframework.core.io.ResourceLoader
3.發布事件到已注冊的監聽器,此能力繼承自 ApplicationEventPublisher
4.提供國際化的消息訪問,此能力繼承自 MessageSource
好對ApplicationContext有一定了解之后我們再來看看Spring提供的事件監聽。
為了實現事件監聽的能力Spring為我們提供了兩個頂層接口/抽象類
ApplcationEvent:是個抽象類,里面只有一個構造函數和一個長整型的timestamp。我們自定義的Application event 需要繼承這個抽象類.
ApplicationListener:是一個接口,里面只有一個方法onApplicationEvent  ,每一個實現改接口的類都要自己實現這個方法。 
 
Spring的事件監聽是基於標准的觀察者模式的,如果在ApplicationContext部署了一個實現了ApplicationListener的bean,那么當一個ApplicationEvent發布到
ApplicationContext時,這個bean得到通知並作特定的處理。
從上面這段話我們很容易產生兩點思考:1.實現了ApplicationListener的bean如何部署到ApplicationContext  2.一個ApplicationEvent如何發布到ApplicationContext
下面我們就通過具體的代碼來看看這兩個問題
廢話少說,先看代碼!
(同步方式,默認監聽當前所有事件spring boot
第一:先自定義一個MsgEvent,它本身提供一個print()方法:
/**
* 自定義管理事件
*/
public class MessageEvent extends ApplicationEvent {
/**
* 在自定義事件的構造方法中除了第一個source參數,其他參數都可以去自定義
* 可以根據項目實際情況進行監聽傳參
*/
private final String message;//事件交互信息
private final String JNDI;//過濾指定監聽
private final String desc;//描述可傳特殊參數不滿足時擴展改成MAP/Object目前沒遇到太特殊的
/*
* 保存JNDI的信息
* 用來過濾具體執行的監聽方法
*/
public MessageEvent(Object source,String message,String desc) {
super(source);
this.message = message;
this.JNDI = (String) source;
this.desc = desc;
}

public String getJNDI() {
return JNDI;
}

public String getMessage() {
return message;
}

public String getDesc() {
return desc;
}

第二:定義一個監聽

/**
* 測試用自定義監聽器,監聽事件為MyEvent
*/
@Component
public class MyLisenter implements ApplicationListener<MyEvent> {
/**
* 對監聽到的事件進行處理
* @param myEvent
*/
@Override
public void onApplicationEvent(MyEvent myEvent) {

/*
這里不做處理,只對消息進行透傳打印,實際情況,
可以根據項目進行邏輯進行處理
*/
myEvent.printMsg(myEvent.getMsg());
System.out.println("監聽到。。。");
}
}

第三:現在自定義事件和監聽器都好了,我們就來看看第一個問題,監聽器如何部署到ApplicationContext,有四種方式可以實現,我們一個一個看:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM