Spring中提供了ApplicationEvent+@EventListener注解可以实现自定义事件监听,是基于观察者模式的。
组成要素
自定义事件
继承ApplicationEvent,自定义Event
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
@Setter @Getter public class MyEvent extends ApplicationEvent { public MyEvent(Object source, Map<String, String> map) { super(source); this.map = map; }
private Map<String, String> map; }
|
自定义监听器
@EventListener 注解实现自定义监听器,对自定义的事件进行监听。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@Component @Slf4j public class MyEventHandler {
@EventListener public void handleMyEvent(MyEvent myEvent) { log.info("----- handleMyEvent -----"); myEvent.getMap().put("city", "beijing"); }
}
|
发布事件
使用ApplicationEventPublisher或者ApplicationContext对自定义的事件进行发布
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
@Component public class MyEventTrigger {
@Autowired private ApplicationEventPublisher applicationEventPublisher;
public Map<String, String> trigger() { Map<String, String> map = new HashMap<>(); map.put("name", "zhangting"); map.put("city", "nanjing"); ApplicationEvent event = new MyEvent(this, map); applicationEventPublisher.publishEvent(event); return map; } }
|
测试,触发事件
模拟请求,对发布的事件进行模拟触发,查看日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Slf4j @RestController @RequestMapping("/v1") public class TestController {
@Autowired private MyEventTrigger myEventTrigger;
@GetMapping("/event") public ResponseEntity<?> event() { log.info("begin /v1/event"); Map<String, String> map = myEventTrigger.trigger(); log.info("end /v1/event"); return new ResponseEntity<>(map, HttpStatus.OK); } }
|
测试结果
使用postman对接口/v1/event发起请求。
在trigger()方法中,我们自定义了一个map,里面有两个字段{“name”:”zhangting”,”city”:”nanjing”},在监听器里我们对map中的city字段进行了覆盖,改成了beijing。
查看postman的返回结果:
原有city字段值为nanjing,在监听器中成功被覆盖成了beijing。