spring 5.0.x源码学习系列十: 观察者设计模式与Spr

2021-03-23  本文已影响0人  avengerEug

theme: channing-cyan

前言

一、观察者模式

1.1 根据一个案例实现一个观察者设计模式

1.1.1 版本1

1.1.2 版本二

1.1.3 版本3

1.1.4 版本4

1.2 观察者设计模式特点

二、Spring 事件模型

2.1 spring事件模型类型

2.2 ApplicationContextEvent事件触发步骤

  1. 新建自定义事件源。继承ApplicationEvent类, 并重写带参构造方法

       public class MyApplicationEvent extends ApplicationEvent {
           // 带参构造方法中的参数就是可以为事件添加一些参数, 即
           // 自定义一些事件
           public MyApplicationEvent(Object source) {
               super(source);
           }
       }
    
  2. 新建事件监听器。

       // 1. 需要添加@Component注解, 让监听者作为spring的一个bean
       // 2. 其次, 要实现ApplicationListener接口, 泛型为上述定义的事件源(MyApplicationEvent)
       @Component
       public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
       
           @Override
           public void onApplicationEvent(MyApplicationEvent event) {
               System.out.println("监听者, " + event);
           }
       }
    
  3. 获取spring ApplicationEventPublisher对象

       // 新建了一个bean来维护上下文对象
       @Component
       public class ApplicationContextHolder implements ApplicationContextAware {
       
           private static ApplicationContext applicationContext;
       
           @Override
           public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
               applicationContext = applicationContext;
           }
      
           public static ApplicationContext getApplicationContext() {
               return applicationContext;
           }
       }
    
  4. 触发事件

       // 拿到spring上下文发布事件
       // spring上下文如何拿到? spring上下文是指实现了ApplicationContext接口的类
       // 在以java config技术开启的spring应用程序中, 可以用AnnotationConfigApplicationContext的实例, 第三步可以忽略
       // 若是spring web应用程序, eg: spring mvc, 则可以新增一个bean并实现ApplicationContextAware接口, eg: 第三步
       ApplicationContextHolder.getApplicationContext().publishEvent(new MyApplicationEvent(new String[] {
          "1", "2"
       }))
    

2.3 ApplicationContextEvent的四种类型总结

类型 如何触发 触发时机 spring 上下文初始化后是否能触发
ContextRefreshEvent 发布类型为ContextRefreshEvent的事件. 调用spring上下文refersh方法
ContextStopEvent 发布类型为ContextStopEvent的事件 调用spring上下文stop方法
ContextStartEvent 发布类型为ContextStartEvent的事件 调用spring上下文start方法
ContextCloseEvent 发布类型为ContextCloseEvent的事件 调用spring上下文close方法

2.4 RequestHandlerEvent类型的事件

三、总结

上一篇下一篇

猜你喜欢

热点阅读