Spring監聽事件使用

廢話前言:java

首先說一下我爲何使用事件,好比如今建立一個訂單可是我建立成功後要給客戶發送一條短信和一個郵件提醒,自己沒建立訂單一系列操做就須要不少時間可是我還要去發送短信和郵件,期間還要調用其它服務來實現耗時比較長達不到客戶的滿意度,因此使用的方式能夠說一下:spring

1:activeMQ(異步)app

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

下面咱們只說第二種方式async

在談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;
}

第二:定義一個監聽ide

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

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

第三:如今自定義事件和監聽器都好了,咱們就來看看第一個問題,監聽器如何部署到ApplicationContext,有四種方式能夠實現,咱們一個一個看:函數

相關文章
相關標籤/搜索