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

相关文章
相关标签/搜索