只有某一个事件发生后,才允许响应目标事件
设计原理
定义变量,指定事件发生后,设置该变量的值;
当目标事件发生时,判断该值,只有当变量值已经变成目标值,才允许响应目标事件。
例子
/**
* Calls {@link ContextRefresher#refresh} when a {@link RefreshEvent} is received. Only
* responds to {@link RefreshEvent} after receiving an {@link ApplicationReadyEvent}, as
* the RefreshEvents might come too early in the application lifecycle.
* 这里就是在当 获取到 事件 ApplicationReadyEvent 后,才会响应 RefreshEvent
* @author Spencer Gibb
*/
public class RefreshEventListener implements SmartApplicationListener {
private static Log log = LogFactory.getLog(RefreshEventListener.class);
private ContextRefresher refresh;
//该例以原子类 AtomicBoolean 作为变量。
private AtomicBoolean ready = new AtomicBoolean(false);
public RefreshEventListener(ContextRefresher refresh) {
this.refresh = refresh;
}
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationReadyEvent.class.isAssignableFrom(eventType)
|| RefreshEvent.class.isAssignableFrom(eventType);
}
//核心代码
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationReadyEvent) {
handle((ApplicationReadyEvent) event);
}
else if (event instanceof RefreshEvent) {
handle((RefreshEvent) event);
}
}
public void handle(ApplicationReadyEvent event) {
this.ready.compareAndSet(false, true);
}
public void handle(RefreshEvent event) {
if (this.ready.get()) { // don't handle events before app is ready
log.debug("Event received " + event.getEventDesc());
Set<String> keys = this.refresh.refresh();
log.info("Refresh keys changed: " + keys);
}
}
}