当对象间存在一对多关系时, 则使用观察者模式(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各个生命周期的事件