• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:spring-50x源码学习系列十-观察者设计模式与Spring-事件驱动模型

java 搞代码 3年前 (2022-02-19) 31次浏览 已收录 0个评论
文章目录[隐藏]

前言

  • 上篇博客spring 5.0.x源码学习系列九: FactoryBean和BeanFactory次要介绍了spring中的两个非凡的bean, FactoryBeanBeanFactory。本次,咱们将开始介绍下spring的事件驱动模型以及它应用的设计模式: 观察者设计模式

一、观察者模式

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

  • 假如有这么一个场景,小黄和小杨一起在看电影,当电影播放到精彩的剧情时,小黄小杨别离会有不同的行为表现。小黄会睡觉,小杨会哭泣。上面咱们将应用代码来模拟出这个案例。

1.1.1 版本1

  • Application.java入口类
  • Huang.java小黄实体类
  • Yang.java小杨实体类
  • Movie.java电影类
  • 运行后果
  • 小结:

    • 应用上述的形式实现了案例的需要,但有如下毛病
    1. 观察者须要全程观看电影,占用观察者大量工夫
    2. 当电影播放到精彩局部的时候本人来被动告诉本人要做些事件了。

1.1.2 版本二

  • 修复了版本一的问题:

    1. 由电影来告诉观察者,省去观察者须要全程观看电影的毛病,由电影来告诉观察者该做一些事件了
  • Application.java
  • Huang.java
  • Yang.java
  • Movie.java
  • 运行后果
  • 小结,版本二的观察者模式具备如下毛病:

    1. 观察者的行为动作不对立,被观察者代码保护难度大
    2. 扩展性低,若观察者须要减少,则须要手动在被察看中增加观察者的援用,反复工作多

1.1.3 版本3

  • 此版本修复了版本2的毛病:

    1. 观察者行为动作不对立
    2. 扩展性低
  • MovieObserver.java
  • Application.java
  • Huang.java
  • Movie.java
  • Yang.java
  • 运行后果
  • 小结

    1. 版本3是观察者模式的根本模型,然而它并没有形象出事件的概念。其实也形象进去了。MovieObserver相当于事件的监听者,Movie播放精彩局部的动作是一个事件。notifyObservers相当于公布事件。

1.1.4 版本4

  • 此版本基于版本3做了些批改, 将事件、监听者、公布事件的概念增加了进去
  • MovieEvent.java
  • MovieListener.java
  • Application.java
  • Huang.java
  • Movie.java
  • Yang.java
  • 运行后果
  • 小结

    1. 版本4将事件的概念形象了进去,会依据公布不同的事件响应不同的行为
    2. 在此版本中,一共定义了两种类型的事件感人类型事件, 悲剧类型事件

1.2 观察者设计模式特点

  • 被观察者持有观察者的援用
  • 耦合性低,被观察者在特定工夫公布特定事件,观察者具体的行为动作由观察者本人决定
  • 提供新增和移除观察者api,可任意扩容观察者数量

二、Spring 事件模型

2.1 spring事件模型类型

  • ApplicationContextEvent
  • RequestHandlerEvent

2.2 ApplicationContextEvent事件触发步骤

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

    <code class="java">   public class MyApplicationEvent extends ApplicationEvent {
           // 带参构造方法中的参数就是能够为事件增加一些参数, 即
           // 自定义一些事件
           public MyApplicationEvent(Object source) {
               super(source);
           }
       }
    1. 新建事件监听器。

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

      <code class="java">   // 新建了一个bean来保护上下文对象
         @Component
         public class ApplicationContextHolder implements ApplicationContextAware {
         
             private static ApplicationContext applicationContext;
         
             @Override
             public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
                 applicationCon<i style="color:transparent">来源gaodai$ma#com搞$代*码网</i>text = applicationContext;
             }
        
             public static ApplicationContext getApplicationContext() {
                 return applicationContext;
             }
         }
    3. 触发事件

      <code class="java">   // 拿到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类型的事件

  • 待总结

三、总结

  • Spring事件驱动模型是基于观察者设计模式衍生而来的,jdk也有自带的观察者设计模式类,别离是被观察者: Observable观察者: Observer。但jdk自带的观察者设计模式类并没有把事件集成进去,尽管JDK中存在事件相干的类,比方EventObject类,但仅仅是被利用到了java swing编程。
  • 本次博客代码仓库地址: https://github.com/AvengerEug/observer-csdn.git
  • I am a slow walker, but I never walk backwards.

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:spring-50x源码学习系列十-观察者设计模式与Spring-事件驱动模型

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址