Spring ApplicationEvent 事件处理--不用引入中间件

一、背景

有一天,小王向小李请教:"我碰到了一个功能需求,用户注册完账号后,我们需要通知他们进行激活。我想实现异步处理,但不知道怎么做才更优雅。"小李听后,不假思索地说:"你可以直接开启一个异步线程去发送通知。"小王听后有些犹豫,他略显尴尬地回应:"有没有更优雅一点的实现方式呢?"

小李皱了皱眉,似乎有些不耐烦,他提议道:"那你可以考虑使用MQ消息队列来实现异步处理。"然而,小王却有些为难地说:"我们系统目前还没有使用MQ消息队列,为了这个功能引入一个全新的中间件,似乎有些不太合适。"

正当小李准备发火时,大林子走了过来。他一脸佛系,平静地说:"这其实很简单,你完全可以使用Spring提供的事件机制来实现。"小王和小李听后,仿佛发现了新大陆一般,他们之前一直在关注各种中间件,却忽略了Spring本身提供的功能。

大林子解释道:"Spring的事件机制允许你发布事件,并可以有多个监听器来响应这些事件。你可以定义一个用户注册完成的事件,并发布它。然后,你可以创建一个监听器来异步地处理这个事件,比如发送激活通知。这样既实现了异步处理,又保持了代码的优雅和清晰。"

小王和小李听后,都恍然大悟。他们意识到,在追求技术创新的同时,也不能忽视对现有框架和技术的深入理解和应用。只有真正掌握了这些基础,才能在面对各种需求时,找到最合适的解决方案。

二、示例代码

Controller层

java 复制代码
@RestController
public class IndexController {

    @Autowired
    private ApplicationContext ioc;

    @RequestMapping("index")
    public String index(@RequestParam("param")String param) {
        System.out.println("==========异步执行开始=======");
        ioc.publishEvent(new DemoEvent(param));
        System.out.println("==========异步执行结束=======");
        return "success";
    }
}

继承 springframework 事件 抽象类

java 复制代码
public abstract class AbstractEvent extends ApplicationEvent {
    public AbstractEvent(Object source) {
        super(source);
    }

    /**
     * 事件执行方法
     *
     * @throws InterruptedException
     */
    protected abstract void execute() throws InterruptedException;
}

统一事件 监听器

java 复制代码
@Component
public class AbstractEventListener implements ApplicationListener<AbstractEvent> {

    @Override
    @Async
    public void onApplicationEvent(AbstractEvent event) {
        try{
            event.execute();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

事件执行例子

java 复制代码
public class DemoEvent extends AbstractEvent {

    public DemoEvent(Object source) {
        super(source);
    }

    @Override
    protected void execute() throws InterruptedException {
        String param = (String) source;
        switch (param){
            case "1":
                System.out.println("111111");
                break;
            case "2":
                System.out.println("222222");
                break;
            default:
                System.out.println("未知操作");
                break;
        }
    }
}
相关推荐
小厂永远得不到的男人10 分钟前
基于 Spring Validation 实现全局参数校验异常处理
java·后端·架构
计算机编程小咖1 小时前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
艾莉丝努力练剑1 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
老华带你飞1 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
自强的小白2 小时前
学习Java24天
java·学习
Ashlee_code3 小时前
香港券商櫃台系統跨境金融研究
java·python·科技·金融·架构·系统架构·区块链
还梦呦3 小时前
2025年09月计算机二级Java选择题每日一练——第五期
java·开发语言·计算机二级
2501_924890523 小时前
商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化
java·大数据·人工智能·深度学习·算法·目标检测·计算机视觉
從南走到北4 小时前
JAVA国际版东郊到家同城按摩服务美容美发私教到店服务系统源码支持Android+IOS+H5
android·java·开发语言·ios·微信·微信小程序·小程序
qianmoq4 小时前
第04章:数字流专题:IntStream让数学计算更简单
java