Spring 事件驅(qū)動(dòng)模型概念
Spring 事件驅(qū)動(dòng)模型就是觀察者模式很經(jīng)典的一個(gè)應(yīng)用,我們可以通過(guò)Spring 事件驅(qū)動(dòng)模型來(lái)完成代碼的解耦。
三角色
Spring 事件驅(qū)動(dòng)模型或者說(shuō)觀察者模式需要三個(gè)類角色來(lái)支撐完成怀伦。分表是:
- 事件——
ApplicationEvent
- 事件監(jiān)聽(tīng)者——
ApplicationListener
- 事件發(fā)布者——
ApplicationEventPublisher
,ApplicationContext
步驟
- 定義一個(gè)事件: 實(shí)現(xiàn)一個(gè)繼承自
ApplicationEvent
忿晕,并且寫(xiě)相應(yīng)的構(gòu)造函數(shù)侣背; - 定義一個(gè)事件監(jiān)聽(tīng)者:實(shí)現(xiàn)
ApplicationListener
接口卸留,重寫(xiě)onApplicationEvent()
方法走越; - 使用事件發(fā)布者發(fā)布消息: 可以通過(guò)
ApplicationEventPublisher
的publishEvent()
方法發(fā)布消息。
代碼示例
// 定義一個(gè)事件,繼承自ApplicationEvent并且寫(xiě)相應(yīng)的構(gòu)造函數(shù) 注意這個(gè)事件是給發(fā)布者創(chuàng)建出來(lái)發(fā)送事件的耻瑟,
// 所有不能加 @Component
public class MyApplicationEvent extends ApplicationEvent {
private String message;
public MyApplicationEvent(Object source,String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
//// 發(fā)布事件,我們依賴于spring自帶的applicationContext來(lái)發(fā)布事件赏酥,applicationContext實(shí)現(xiàn)了ApplicationEventPublisher 接口
@Component
public class MyApplicationEventPublisher {
@Autowired
ApplicationContext applicationContext;
public void publish(String message) {
applicationContext.publishEvent(new MyApplicationEvent(this, message));
}
}
//// 定義一個(gè)事件監(jiān)聽(tīng)者,實(shí)現(xiàn)ApplicationListener接口喳整,重寫(xiě) onApplicationEvent() 方法
//注意泛型列是監(jiān)聽(tīng)的事件類名
@Component
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent myApplicationEvent) {
System.out.println(myApplicationEvent.getMessage());
}
}
//測(cè)試類
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class EventTest {
@Autowired
MyApplicationEventPublisher myApplicationEventPublisher;
@Test
public void test(){
myApplicationEventPublisher.publish("hello world");
}
//hello world
}