zoukankan      html  css  js  c++  java
  • spring中的观察者模式

    一、Spring 中观察者模式的四个角色

    1. 事件(ApplicationEvent)

    ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过 source 得到事件源。

    下列描述了Spring提供的内置事件:

    • ContextRefreshedEvent:事件发布在 ApplicationContext 初始化或刷新时(例如:通过在 ConfigurableApplicationContext 接口使用refresh()方法)。这里,“初始化”意味着所有 bean 加载,post-processor bean 被检测到并且激活,单例预先实例化,ApplicationContext 对象可以使用了。只要上下文没有关闭,可以触发多次刷新, ApplicationContext 提供了一种可选择的支持这种“热”刷新。例如:XmlWebApplicationContext 支持热刷新,但 GenericApplicationContext 并非如此。具体是在 AbstractApplicationContext 的 finishRefresh() 方法中。
    • ContextStartedEvent:事件发布在 ApplicationContext 开始使用 ConfigurableApplicationContext 接口 start() 方法。这里,“开始”意味着所有生命周期 bean 接收到一个明确的起始信号。通常,这个信号用于明确停止后重新启动,但它也可以用于启动组件没有被配置为自动运行(例如:组件还没有开始初始化)。
    • ContextStoppedEvent:事件发布在 ApplicationContext 停止时通过使用 ConfigurableApplicationContext 接口上的 stop() 方法。在这里,“停止”意味着所有生命周期bean接收一个显式的停止信号。停止上下文可以通过重新调用start()方法。
    • ContextClosedEvent:事件发布在 ApplicationContext 关闭时通过关闭 ConfigurableApplicationContext 接口()方法。这里,“封闭”意味着所有单例 bean 被摧毁。一个封闭的环境达到生命的终结。它不能刷新或重启。
    • RequestHandledEvent:一个特定的web事件告诉所有能处理HTTP请求的bean 。这个事件是在请求完成后发布的。这个事件只适用于使用 Spring 的 DispatcherServlet 的web应用程序。

    2. 事件监听(ApplicationListener)

    ApplicationListener 事件监听器,也就是观察者。继承自 jdk 的 EventListener,该类中只有一个方法 onApplicationEvent。当监听的事件发生后该方法会被执行。

    3. 事件发布(ApplicationContext)

    ApplicationContext 是 Spring 中的核心容器,在事件监听中 ApplicationContext 可以作为事件的发布者,也就是事件源。因为 ApplicationContext 继承自 ApplicationEventPublisher。在 ApplicationEventPublisher 中定义了事件发布的方法 — publishEvent(Object event)

    4. 事件管理(ApplicationEventMulticaster)

    ApplicationEventMulticaster 用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把 Applicationcontext 发布的 Event 广播给它的监听器列表。

    二、Spring中实现观察者模式

    1. 自定义需要发布的事件类,需要继承 ApplicationEvent 类或 PayloadApplicationEvent (该类也仅仅是对 ApplicationEvent 的一层封装)
    2. 使用 @EventListener 来监听事件或者实现 ApplicationListener 接口。
    3. 使用 ApplicationEventPublisher 来发布自定义事件(@Autowired注入即可)

    实例:

      1、事件event,需要继承 ApplicationEvent

      

    public class ProcessInfoEvent extends ApplicationEvent {
    
        private ProcessInfo processInfo;
        public ProcessInfoEvent(Object source) {
    
            super(source);
            ProcessInfo source1 = (ProcessInfo) source;
            this.processInfo = source1;
    
        }
    
        public ProcessInfo getProcessInfo() {
            return processInfo;
        }
    
        public void setProcessInfo(ProcessInfo processInfo) {
            this.processInfo = processInfo;
        }
    }
    

    2、事件发布-直接使用 spring的 ApplicationContext 或者 ApplicationEventPublisher即可

      

    @Autowired
    private ApplicationEventPublisher publisher;
    
    
    
    @Override
        public RemoteResult<PageInfo> test(Object object) {
    
            publisher.publishEvent(new ProcessInfoEvent());
         //正常业务流程
         。。。。。。。。。。。。。。。。 }

      

    3、监听事件--方法上使用 @EventListener注解即可,或者自定义类继承自 jdk 的 EventListener;

        @EventListener
        @Async     //异步注解;如果不使用该注解,2、3 中的业务流程将 顺序执行;3中的方法出现异常,将影响2 中的正常业务的执行;
             //如果使用异步注解,2、3解耦和;3中 eventListers中的方法执行将不会影响2中正常业务的执行 public void eventListener(ProcessInfoEvent event){ RemoteResult<Boolean> booleanRemoteResult = agentBillApi.processInfo(event.getProcessInfo()); }

      

  • 相关阅读:
    [转]SubVersion 和 CVSNT在Windows下的安装及初步管理
    [Java20071101]JDK配置
    [English20071023]疯狂英语永恒不变的18条黄金法则
    [文摘20071020]富人和穷人的经典差异
    [English20071024]疯狂突破高中句型300句
    [文摘20071017]回家真好 (工作是为了生活)
    [文摘20071020]老婆和老妈掉水里终于有答案啦
    [转]flash与后台数据交换方法整理
    Repeater使用:绑定时 结合 前台JS及后台共享方法
    [文摘20071019]九九重阳节的来历 重阳节传说故事 重阳节的活动习俗 重阳节诗篇
  • 原文地址:https://www.cnblogs.com/wl20200316/p/12582978.html
Copyright © 2011-2022 走看看