Spring 事務事件監控及實現原理

1. 示例

       對於事務事件,Spring提供了一個註解@TransactionEventListener,將這個註解標註在某個方法上,那麼就將這個方法聲明爲了一個事務事件處理器,而具體的事件類型則是由TransactionalEventListener.phase屬性進行定義的。以下是TransactionalEventListener的聲明:數據庫

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @EventListener public @interface TransactionalEventListener { // 指定當前標註方法處理事務的類型 TransactionPhase phase() default TransactionPhase.AFTER_COMMIT; // 用於指定當前方法若是沒有事務,是否執行相應的事務事件監聽器 boolean fallbackExecution() default false; // 與classes屬性同樣,指定了當前事件傳入的參數類型,指定了這個參數以後就能夠在監聽方法上 // 直接什麼一個這個參數了 @AliasFor(annotation = EventListener.class, attribute = "classes") Class<?>[] value() default {}; // 做用於value屬性同樣,用於指定當前監聽方法的參數類型 @AliasFor(annotation = EventListener.class, attribute = "classes") Class<?>[] classes() default {}; // 這個屬性使用Spring Expression Language對目標類和方法進行匹配,對於不匹配的方法將會過濾掉 String condition() default ""; }

       關於這裏的classes屬性須要說明一下,若是指定了classes屬性,那麼當前監聽方法的參數類型就能夠直接使用所發佈的事件的參數類型,若是沒有指定,那麼這裏監聽的參數類型能夠使用兩種:ApplicationEvent和PayloadApplicationEvent。對於ApplicationEvent類型的參數,能夠經過其getSource()方法獲取發佈的事件參數,只不過其返回值是一個Object類型的,若是想獲取具體的類型還須要進行強轉;對於PayloadApplicationEvent類型,其能夠指定一個泛型參數,該泛型參數必須與發佈的事件的參數類型一致,這樣就能夠經過其getPayload()方法獲取事務事件發佈的數據了。關於上述屬性中的TransactionPhase,其能夠取以下幾個類型的值:spa

public enum TransactionPhase { // 指定目標方法在事務commit以前執行 BEFORE_COMMIT, // 指定目標方法在事務commit以後執行 AFTER_COMMIT, // 指定目標方法在事務rollback以後執行 AFTER_ROLLBACK, // 指定目標方法在事務完成時執行,這裏的完成是指不管事務是成功提交仍是事務回滾了 AFTER_COMPLETION }

       這裏咱們假設數據庫有一個user表,對應的有一個UserService和User的model,用於往該表中插入數據,而且插入動做時使用註解標註目標方法。以下是這幾個類的聲明:code

相關文章
相關標籤/搜索