用设计模式学springboot源码合集一:观察者模式下的springboot监听

前言:

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<E extends ApplicationEvent> extends EventListener {

    /**
     * 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方法进行行为通知。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值