基於Spring實現seam形式的事件機制

火星人 @ 2014-03-09 , reply:0


  Seam的Events用的很舒服,spring提供的事件機制太羅嗦,所以起了念頭,著這思路移植一下.最終效果如下:

  1 //發布事件

  2 Events.instance().fire(eventName,arg1,arg2.);

  3

  4 //發布非同步事件

  5 Events.instance().fireAsynchronous(eventName,arg1,arg2.);

  6

  7 //在事務中,發布當事務成功commit時觸發的事件

  8 Events.instance().fireOnTransactionSuccess(eventName,arg1,arg2.);

  9

  10 //在事務中,發布當事務完成(commit/rollback)時觸發的事件

  11 Events.instance().fireOnTransactionCompletion(eventName,arg1,arg2.);

  12

  13

  14

  15 //下面是監聽事件的方式

  16

  17 //在任意application scope的bean中,在方法上加@Observer註解,同時保證參數列表和發布事件時的參數列表相同:

  18 @Observer(eventName)

  19 public void someEventListener(A arg1,B arg2){

  20 //

  21 }

  22

  23 //以上代碼針對的是Events.instance().fireXx方式發布的事件,如果要監聽spring方式發布的事件,可以這麼寫:

  24 @Observer(type=ContextRefreshedEvent.class)

  25 public void initAll(ContextRefreshedEvent event){

  26 //注意參數只能是一個spring的event

  27 }

  採用如上的方式發布、監聽事件,免去了eventPublisher之類的東西,也免去了event類型的定義.用起來還是比較舒服的.

  實現起來也很簡單,系統啟動的時候掃描一遍標記了Observer註解的方法,記錄一下,然後在事件觸發的時候做相應的處理即可.其中,非同步事件使用了一個TaskExecutor來完成觸發.比較實用的和事務相關的兩種事件促發方式,使用了spring提供的TransactionSynchronizationManager這個類的靜態方法registerSynchronization,實現起來也很簡單.

  附件放上相關的幾個類,其中可能還有些不完善的地方,大伙兒可以看看.





[火星人 via ] 基於Spring實現seam形式的事件機制已經有116次圍觀

http://www.coctec.com/docs/java/show-post-59772.html