Spring中的ApplicationContext.publishEvent

本文介绍了在Spring框架中如何使用事件驱动机制,如XXXXEvent和XXXXEventListener,实现雇主和求职者在招聘平台上的匹配推荐。通过`ApplicationContext.publishEvent`发布事件,监听器自动处理,提高代码复用性和系统解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ApplicationContext.publishEvent简单理解

其实就是监听处理。比如找工作平台上,雇主 employer 发布自己的雇佣条件,目的是平台中有符合条件的求职者时,及时向雇主推荐。求职者发布简历,当平台发现某个求职者比较符合条件,就触发被动,推荐给雇主。

二、ApplicationContext.publishEvent实现的组成

  1. XXXXXXXEvent:容器事件,相当于上方的【目的是平台中有符合条件的求职者时,及时向雇主推荐】。这个事件继承ApplicationEvent,声明我是一个事件。
  2. XXXXXXXEventListener:事件监听器,相当于上方的【当平台发现某个求职者比较符合条件,就触发被动,推荐给雇主。】。其实包含两个主要功能:一个是监听某个event是否被发布了,一个是若是event被发布了,之后的处理操作。继承ApplicationListener
  3. applicationContext.publishEvent:发布事件,用来触发容器事件。相当于上方的【求职者发布简历】。该方法相当于人为去发布事件,进而引起EventListener中内容的执行。但当系统创建spring容器、加载spring容器时会自动触发容器事件

三、ApplicationContext.publishEvent使用场景

当系统中的某个操作可在多个功能中被执行时,且该操作所需参数固定,使用这一方法可大大减少代码量;
不同Bean之间进行传递时,也可实现解耦。

四、ApplicationContext.publishEvent举例

文件结构(只做参考)

在这里插入图片描述

applicationContext.publishEvent发布事件
    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult<BillSupplier> test(@RequestParam(value = "param2") String param2) {
    
        applicationContext.publishEvent(new XXXXEvent(this, param2));
        
        return CommonResult.success("测试成功!");
    }
XXXXEvent.java
@Getter
@Setter
public class XXXXEvent extends ApplicationEvent {
    private param2;

    public XXXXEvent(Object source, param2) {
        super(source);
        this.param2 = param2;
    }
}
XXXXHandler.java
@EnableAsync
public class XXXXHandler implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof XXXXEvent) {
            try {
                // 此处为处理逻辑
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            // log.info("容器本身事件:" + event);
        }
    }
}
	此处介绍一下instanceof:
	作用:检查左侧对象是否为右侧类或其子类的实例,若是则为true,否则为false。

五、@EventListener

个人理解就是将上述中的ApplicationContext.publishEvent封装起来了,只要给方法添加@EventListener注解就可以将其定义为一个监听器
其他部分与上述相同

XXXXHandler.java
public class XXXXHandler {

    @Override
    @EventListener(classes = ExceptionUpdateBillsEvent.class)
    public void onApplicationEvent(ApplicationEvent event) {
        
    }
}

六、@TransactionalEventListener

其他部分与上述相同

XXXXHandler.java
public class XXXXHandler {

     @Async
    @TransactionalEventListener(classes = ApplyInvoiceEvent.class)
        @Order(1)
    public void onApplicationEvent(ApplicationEvent event) {
        
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值