1. 介绍
事件Event驱动模型实际也被称之或者发布/订阅模型。Spring中,也为我们提供了这样的框架,采用Event/Listener这样的好处自然不用多说,就是解耦,利于扩展,并且利于一对多这种形式,我们下面就来介绍下Spring的Event模式
2. 核心
主要就3个:
ApplicationEvent:事件本身
ApplicationEventPublisher:事件发布者
ApplicationListener:事件监听者
事件监听者会一直监听事件,当事件发布者发布事件后,事件监听者能够给监听到事件,并作出一些操作
2.1 事件
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(String message) {
super(message);
}
}
继承ApplicationEvent类,然后写个构造函数即可
2.2 事件发布者
有两种方式,
第一个是通过实现ApplicationEventPublisherAware接口
它的setApplicationEventPublisher重写方法中的参数是可以直接使用的publisher
@Component
public class EventPublish implements ApplicationEventPublisherAware{
private ApplicationEventPublisher applicationEventPublisher;
//该方法的参数就是可以直接使用的发布者,所以我们可以将它赋予到成员变量上来进行使用
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
// 发布事件
public void publish() {
applicationEventPublisher.publishEvent(new MyApplicationEvent("hello"));
}
}
第二种是直接注入使用
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
打印了以下注入后的applicationEventPublisher,发现它其实是已经存在的bean:
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
默认的ApplicationEventPublisher实现就是AbstractApplicationContext。
2.3 事件监听者
也有两种方式可以实现:
注解方式
@Configuration
public class EventListenerConfig {
@EventListener
public void onEvent(MyApplicationEvent event) {
System.out.println("监听事件注解方式 : " + event);
}
}
实现类方式
@Component
public class MyEventListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("监听事件实现方式 : " + event);
}
}
3 测试
使用事件发布者发布事件即可,监听器会打印出内容