Spring事件驱动模型
spring事件驱动模型,是我们常说的发布订阅模式,常用于程序之间的解耦。这种模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。
发布订阅模式及其实现
事件 (Spring Event),即为定义的主题对象,一般需要一个事件源。在spring中有封装,只需要继承ApplicationEvent即可。
import org.springframework.context.ApplicationEvent;
public class DemoEvent extends ApplicationEvent {
/**
* 事件源
* @param source
*/
public DemoEvent(Object source) {
super(source);
}
}
复制代码
发布者 (Spring Event Publish),将上面定义的event广播出去,在spring中广播,是广播到需要用到spring容器,ApplicationContext接口继承了ApplicationEventPublisher,所以以下demo直接用applicationContext直接广播。
Object object = new Object();
applicationContext.publishEvent(new DemoEvent(object);
复制代码
订阅者 (Spring Event Listener)
- 无序监听器,所有订阅者之间没有相互顺序。
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class DemoListener implements ApplicationListener<DemoEvent> {
/**
* 事件处理
*
* @param event
*/
@Async
@Override
public void onApplicationEvent(DemoEvent event) {
Object object = event.getSource();
//do some services
}
}
复制代码
- 有序监听器,所有订阅者之间有一个顺序。
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class DemoOrderListener implements SmartApplicationListener {
/**
* 事件
*
* @param eventType 自定义的spring event
* @return
*/
@Override
public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) {
return eventType == DemoEvent.class;
}
/**
* 事件源
*
* @param sourceType
* @return
*/
@Override
public boolean supportsSourceType(final Class<?> sourceType) {
return sourceType == Object.class;
}
/**
* 自定义逻辑
*
* @param event
*/
@Async
@Override
public void onApplicationEvent(final ApplicationEvent event) {
Object object = event.getSource();
//do some service
}
/**
* 排序方式
*
* @return
*/
@Override
public int getOrder() {
return 1;
}
}
复制代码
- 注解监听器,spring4.2之后提供的一种简便写法。
@Async
@EventListener
public void handling(DemoEvent event){
Object object = event.getSource();
//do some services
}
复制代码