spring 中的事件
spring事件通过订阅发布 可以解耦操作 可以同步 可以异步
步骤
- 编写事件 通过继承
org.springframework.context.ApplicationEvent
来编写事件
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
source
为事件传递的资源,在使用场景中 可以是数据,也可以是函数。事件事例如下:
public class MySpringEvent extends ApplicationEvent {
private boolean signal;
/**
* Create a new ApplicationEvent.
*
* @param signal 这里我传递一个信号到事件监听器中
*/
public MySpringEvent(Boolean signal) {
super(signal);
this.signal=signal;
}
public void doSomething() {
System.out.println("i am an event");
}
public boolean isSignal() {
return signal;
}
}
- 发布事件 发布事件通过实现 事件发布接口
org.springframework.context.ApplicationEventPublisher
或者其门面接口org.springframework.context.ApplicationEventPublisherAware
推荐门面接口
相关实现如下:
public class MySpringEventPublisherAware implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
private MySpringEvent mySpringEvent;
public MySpringEventPublisherAware(MySpringEvent mySpringEvent) {
this.mySpringEvent = mySpringEvent;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
/**
* 发送事件动作 事件的动作需要主动触发
*/
public void refreshEvent() {
System.out.println(">>>>>>>>>>>>>>>>>>>");
this.applicationEventPublisher.publishEvent(mySpringEvent);
}
}
需要特别注意的是 该发布器需要注册为spring bean 而且需要主动调用org.springframework.context.ApplicationEventPublisher#publishEvent(ApplicationEvent event)
来触发事件
- 编写监听器 通过实现
org.springframework.context.ApplicationListener<E extends ApplicationEvent>
来实现事件的监听
public class MyApplicationEventListener implements ApplicationListener<MySpringEvent> {
@Override
public void onApplicationEvent(MySpringEvent event) {
event.doSomething();
System.out.println(event.isSignal());
}
}
通过泛型来限制监听的事件类型,该监听器同样需要注册为spring bean。
- 测试用例