SpringBoot中使用监听器

1.定义一个事件

/**
 * 定义事件
 * @author hrui
 * @date 2024/7/25 12:46
 */
public class CustomEvent extends ApplicationEvent {
    private String message;

    public CustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

在监听器中可以通过 event.getSource(); 来获取事件源

2.通过ApplicationEventPublisher 发布事件

@Service
public class EventPublisherService {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishEvent(String message) {
        CustomEvent event = new CustomEvent(this, message);
        applicationEventPublisher.publishEvent(event);
    }
}

3.通过监听器订阅事件

/**
 * 监听事件,订阅事件
 * @author hrui
 * @date 2024/7/25 12:49
 */
@Component
public class CustomEventListener {


    @Async
    //@EventListener
    //@TransactionalEventListener 有事务的监听
    @EventListener(condition = "#event.message == 'hello'") //SPEL(Spring表达式)条件监听 对象也可以用== 判断
    //@EventListener(condition = "#event.message .equals('hello') ")
    //@EventListener(condition = "#event.message.endsWith("123") ") //很多方法可以选择
    public void handleCustomEvent(CustomEvent event) {
        System.out.println(Thread.currentThread().getName());
        System.out.println("Received event - " + event.getMessage());
    }
}

第三步简单实用了@EventListener注解 如果不用就需要这么做

去实现ApplicationListerner<处理的事件> 需不需要异步自己看着办

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {

    @Override
    public void onApplicationEvent(CustomEvent event) {
        // 条件判断
        if ("hello".equals(event.getMessage())) {
            // 异步处理
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
                System.out.println("Received event - " + event.getMessage());
            }).start();
        }
    }
}

/**
 * @author hrui
 * @date 2024/7/25 12:51
 */
@RestController
public class ListenerController {

    @Autowired
    private EventPublisherService eventPublisherService;

    @GetMapping("/listener")
    public String listener(String message)
    {
        eventPublisherService.publishEvent(message);
        return "listener";
    }
}
相关推荐
magic 24534 分钟前
Java继承中的静态方法隐藏与实例变量隐藏:深入解析与最佳实践
java·开发语言·javase
Java 第一深情1 小时前
JVM面试题解,垃圾回收之“垃圾回收器”剖析
java·jvm·面试
for622 小时前
一文读懂fgc之cms
java·jvm·实践
花心蝴蝶.2 小时前
MyBatis 入门
java·spring boot·后端·mybatis
苹果醋32 小时前
Win10安装MySQL、Pycharm连接MySQL,Pycharm中运行Django
运维·vue.js·spring boot·nginx·课程设计
Kerwin要坚持日更2 小时前
一文讲解Java中的BIO、NIO、AIO之间的区别
java·开发语言
汤姆yu3 小时前
基于Springboot的社区药房管理系统
java·spring boot·后端·社区药房
程思扬3 小时前
Android笔记:android 动态设置backgroundTint
android·java·网络·笔记·android-studio
2的n次方_3 小时前
Eureka 服务注册和服务发现的使用
spring boot·spring cloud·云原生·eureka·服务发现
八月五3 小时前
跨域问题及解决方案
spring boot·后端