前言:
springboot的框架太复杂了,如何学习springboot才能不让自己迷失在细节里,其实从设计模式学习就很好,因为设计模式是思想,思想引导行为,只有理解了思想,才能看得懂springboot的行为。
正文:
springboot的监听其实和我们用spring时,在web.xml配置的监听是不同的,springboot的监听,是为了监听整个spring的启动、运行过程,而我们在web.xml里配置的监听,其顶层时tomcat提供的监听行为。
明白了springboot的监听,其实就相当于明白了springboot的启动流程。
springboot的监听采用观察者模式进行开发的,那么我们都知道,观察者模式有以下:观察者和被观察者,还有将他们关联起关系的中间人,用专业名词来说,观察者就是Observer ,中间人就是Subject(主题)、C被观察者就是Client。
观察者的作用:观察被观察者的变动,并定义被观察发生相关行为后,自己该执行的行为。
Subject的作用:将观察者组织起来,并且,在被观察者做了某个行为后,遍历这些观察者,并调用他们的行为。
Client的作用:干自己的活。
注:观察者模式的使用并不是一层不变的,观察者模式中三者的关系也不是一层不变的,比如Subject和Client,他们俩既可以成父子关系,也可以是Client内部持有Subject,当自己某个行为发生时,调用这个Subject。
springboot的模式图如下:
整个springboot的监听流程就是上面这些了。
其实简而言之就是:
ApplicationListener是观察者,但是springboot有很多行为,每个观察者观察到这些行为后,做出的反应也不同,我们如何一一对应起来呢?我们可以有两个方法完成这个,第一个就是为实现ApplicationListener为每一个事件创建一个观察者;第二个方法就是使用泛型,用泛型约束观察者。springboot选择泛型。泛型的参数就是事件。
public interface ApplicationListener
/*
Handle an application event.
@param event the event to respond to
/
void onApplicationEvent(E event);
}
ApplicationEventMulticaster是主题,它允许以观察者名称(bean的名称)和对象(bean)两种方式进行注册。
同时,它内部使用了Map集合进行缓存,Map的key是由是由事件类型和事件类型的泛型决定的,第一次获取后会被缓存。
SpringApplicationRunListener是被观察者,它内部持有所有的主题,并在各个事件发生的时候,创建对应的事件类型,并执行主题的发布行为。
但是,SpringApplicationRunListener同时也是一个观察者,它与SpringApplication、SpringApplicationRunListeners也形成了一个观察者模式。
springApplicaition是被观察者。
SpringApplicationRunListeners是主题,它内部持有多个SpringApplicationRunListener。
当springApplication执行的时候,会调用SpringApplicationRunListeners方法进行行为通知。