Springboot使用@EnableAsync,@EventListener自定义异步,同步监听器(观察者模式)

Springboot使用@EnableAsync,@EventListener自定义异步,同步监听器(观察者模式)

1. Springboot 启动类中开启异步 加个@EnableAsync就行了
@SpringBootApplication
@Controller
@EnableAsync
public class SpringBootDemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringBootDemoApplication.class, args);
  }
}
2. 做个发送邮件的事儿,先建个邮件类
@Data
public class Mail {
  private Integer id;
  private String addressee;
  private String sender;
  private String receiver;
  private String message;
}
3. 写个发送邮件的方法
public class SendMail {
  
  public static void sendMail(Mail mail) {
    System.out.println("开始发送邮件了:" + mail.getMessage());
  }
}
4. 写一个需要被监听的事件继承ApplicationEvent ,目前就是发邮件事件
@Data
public class MyEvent extends ApplicationEvent {

  private  Mail mail;

  public MyEvent(Object source,Mail mail){
    super(source);
    this.mail=mail;
    System.out.println("正在发生了一个事件");
  }
}
5. 自定义监听器@Component注入spring, @EventListener调用监听
@Component
public class MyListener {

  @Async
  @EventListener
  public void listenerEvent(MyEvent myEvent){
    System.out.println("已经监听到事件发生了");
    // 调用发邮件方法
    SendMail.sendMail(myEvent.getMail());
  }
}
6. 写个service调用测试一下,发布事件就会被监听器监听到
@Service
public class ListennerService {

  @Autowired
  ApplicationContext context;

  public void enventTest() {
    System.err.println("开始执行的事务");

    Mail mail = new Mail();
    mail.setMessage("邮件内容*************");
    // 调用异步事件监听
    this.context.publishEvent(new MyEvent(this,mail));

    System.err.println("事务执行完成了");
  }
}
7. 异步改成同步监听,去掉所有类里的注解@EnableAsync,@Async就可以了
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@EventListener 和 ApplicationListener 都是用于监听 Spring 应用程序中的事件的机制,但它们有一些不同之处。 1. 监听的事件类型 @EventListener 注解可以用于监听任何类型的事件,包括 Spring 框架的事件和自定义事件。而 ApplicationListener 接口只能监听 Spring 框架提供的事件。因此,如果我们需要监听自定义事件,@EventListener 是更好的选择。 2. 监听方法的参数 @EventListener 注解的监听方法可以接收事件实例作为参数,而 ApplicationListener 接口的 onApplicationEvent 方法只能接收 ApplicationEvent 的子类实例作为参数。因此,如果我们需要获取更具体的事件信息,@EventListener 是更好的选择。 3. 监听方法的声明方式 @EventListener 注解的监听方法可以在任何 Spring Bean 中声明,而 ApplicationListener 接口需要实现 ApplicationListener 接口并将其注册为 Spring Bean。因此,如果我们需要在多个 Bean 中声明监听方法,@EventListener 是更好的选择。 4. 执行顺序 使用 @EventListener 注解声明的监听方法的执行顺序是不确定的,而 ApplicationListener 是按照注册顺序依次执行的。因此,在需要按照特定顺序执行监听方法时,ApplicationListener 是更好的选择。 总的来说,@EventListener 和 ApplicationListener 都是很好的监听事件的机制,具体使用哪一个取决于我们的具体需求。如果需要监听 Spring 框架提供的事件或希望按照注册顺序执行监听方法,则选择 ApplicationListener。如果需要监听自定义事件或获取更具体的事件信息,则选择 @EventListener

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值