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 測試
使用事件發佈者發佈事件即可,監聽器會打印出內容