观察者模式与SpringBoot应用

2022-08-17 14:39:12 浏览数 (1)

当对象间存在一对多关系时, 则使用观察者模式(Observer Pattern). 比如, 当一个对象被修改时, 则会自动通知依赖它的对象.

image.pngimage.png
优点:
  1. 观察者和被观察者是抽象耦合的
  2. 建立一套触发机制
SpringBoot应用场景

在SpringBoot启动流程中org.springframework.boot.SpringApplication#run(java.lang.String...)这个方法里

代码语言:txt复制
	SpringApplicationRunListeners listeners = getRunListeners(args);
	listeners.starting();

SpringBoot加载在spring.factories中预定义的

org.springframework.boot.context.event.EventPublishingRunListener这个类通过其内部定义的事件发布器发布事件

代码语言:txt复制
	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)方法进行监听器的执行

代码语言:txt复制
    @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各个生命周期的事件

0 人点赞