Seam的Events用的很舒服spring提供的事件機制太羅嗦所以起了念頭著這思路移植一下最終效果如下
//發布事件
Eventsinstance()fire(eventNameargarg)
//發布異步事件
Eventsinstance()fireAsynchronous(eventNameargarg)
//在事務中發布當事務成功commit時觸發的事件
Eventsinstance()fireOnTransactionSuccess(eventNameargarg)
//在事務中發布當事務完成(commit/rollback)時觸發的事件
Eventsinstance()fireOnTransactionCompletion(eventNameargarg)
//下面是監聽事件的方式
//在任意application scope的bean中在方法上加@Observer注解同時保證參數列表和發布事件時的參數列表相同
@Observer(eventName)
public void someEventListener(A argB arg){
//
}
//以上代碼針對的是Eventsinstance()fireXx方式發布的事件如果要監聽spring方式發布的事件可以這麼寫
@Observer(type=ContextRefreshedEventclass)
public void initAll(ContextRefreshedEvent event){
//注意參數只能是一個spring的event
}
采用如上的方式發布監聽事件免去了eventPublisher之類的東西也免去了event類型的定義用起來還是比較舒服的
實現起來也很簡單系統啟動的時候掃描一遍標記了Observer注解的方法記錄一下然後在事件觸發的時候做相應的處理即可其中異步事件使用了一個TaskExecutor來完成觸發比較實用的和事務相關的兩種事件促發方式使用了spring提供的TransactionSynchronizationManager這個類的靜態方法registerSynchronization實現起來也很簡單
附件放上相關的幾個類其中可能還有些不完善的地方大伙兒可以看看
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28734.html