简单理解
其实就是监听处理。比如找工作平台上,雇主 employer 发布自己的雇佣条件,目的是平台中有符合条件的求职者时,及时向雇主推荐。求职者发布简历,当平台发现某个求职者比较符合条件,就触发被动,推荐给雇主。
实现的组成
- XXXXXXXEvent:容器事件,相当于上方的【目的是平台中有符合条件的求职者时,及时向雇主推荐】。这个事件继承ApplicationEvent,声明我是一个事件。
- XXXXXXXEventListener:事件监听器,相当于上方的【当平台发现某个求职者比较符合条件,就触发被动,推荐给雇主。】。其实包含两个主要功能:一个是监听某个event是否被发布了,一个是若是event被发布了,之后的处理操作。继承ApplicationListener
- applicationContext.publishEvent:发布事件,用来触发容器事件。相当于上方的【求职者发布简历】。该方法相当于人为去发布事件,进而引起EventListener中内容的执行。但当系统创建spring容器、加载spring容器时会自动触发容器事件
使用场景
当系统中的某个操作可在多个功能中被执行时,且该操作所需参数固定,使用这一方法可大大减少代码量;
不同Bean之间进行传递时,也可实现解耦。
举例
文件结构(只做参考)
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。