Spring自定义事件发布与监听

介绍

Spring提供了完整的事件发布与监听模型,在该模型中,事件发布方只需将事件发布出去,无需关心有多少个对应的事件监听器;

监听器无需关心是谁发布了事件,并且可以同时监听来自多个事件发布方发布的事件,优点是解耦,帮助大家更好地使用发布/订阅模式;

步骤

完成事件监听,发布者应该注入一个 ApplicationEventPublisher 对象;

监听器应实现 ApplicationListener 接口或者使用注解代替;

如果想要事件监听异步化的话,启动类上还需要添加 @EnableAsync 注解;

例子

ApplicationEventPublisher 事件发布

/**
 * @author 岳晓鵬
 * @version 1.0
 * @date 2022/6/16 17:57
 * @description
 */
public class ApplicationEventTest {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    /**
     * 定义事件发布者
     */
    public void publish(){
        PushVo pushVo = PushVo.builder().build();
        applicationEventPublisher.publishEvent(pushVo);
    }

}

ApplicationListener 事件监听

因为在场景中,需要异步监听,所以在这里添加了@Async注解,

  @Async
  @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
  public void xyPush(PushVo push) {
      log.info("监听:{}", push);
      // 省略代码
  }

@EventListener与@TransactionalEventListener注解

上面说过,监听器应实现 ApplicationListener 接口,但其实使用这两个其中一个注解就可以;

使用@EventListener修饰的监听器,有个弊端,就是不一定可以查到之前插入数据库的数据(因为上一个事务还没有提交);

所以就引出了@TransactionalEventListener注解,能够实现在控制事务的同时,完成对对事件的处理,具体可以看下注解详细参数:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EventListener
public @interface TransactionalEventListener {

	/**
	 * TransactionPhase
	 */
	TransactionPhase phase() default TransactionPhase.AFTER_COMMIT;

	/**
	 * 
	 */
	boolean fallbackExecution() default false;

	/**
	 * 
	 */
	@AliasFor(annotation = EventListener.class, attribute = "classes")
	Class<?>[] value() default {};

	/**
	 *
	 */
	@AliasFor(annotation = EventListener.class, attribute = "classes")
	Class<?>[] classes() default {};

	/**
	 *
	 */
	String condition() default "";
}

TransactionPhase枚举

public enum TransactionPhase {
   // 指定目标方法在事务commit之前执行
   BEFORE_COMMIT,
   // 指定目标方法在事务commit之后执行
   AFTER_COMMIT,
   // 指定目标方法在事务rollback之后执行
   AFTER_ROLLBACK,
   // 指定目标方法在事务完成时执行,这里的完成是指无论事务是成功提交还是事务回滚了
   AFTER_COMPLETION
}

参考:深入理解Spring事件发布与监听.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素人岳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值