当对象间存在一对多关系时, 则使用观察者模式(Observer Pattern). 比如, 当一个对象被修改时, 则会自动通知依赖它的对象.
优点:
- 观察者和被观察者是抽象耦合的
- 建立一套触发机制
SpringBoot应用场景
在SpringBoot启动流程中org.springframework.boot.SpringApplication#run(java.lang.String...)
这个方法里
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
SpringBoot加载在spring.factories中预定义的
org.springframework.boot.context.event.EventPublishingRunListener
这个类通过其内部定义的事件发布器发布事件
private final SimpleApplicationEventMulticaster initialMulticaster;.
@Override
public void starting() {
//事件发布器&事件
this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
}
最终在这个org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType)
方法进行监听器的执行
@Override
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
Executor executor = getTaskExecutor();
//getApplicationListeners根据事件和事件类型过滤监听器
for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
if (executor != null) {
executor.execute(() -> invokeListener(listener, event));
}
else {
//最终调用监听器的onApplicationEvent方法
invokeListener(listener, event);
}
}
}
由此, 开发者可以通过spring.factories定义接口实现类, 处理SpringBoot各个生命周期的事件