zoukankan      html  css  js  c++  java
  • spring-第三篇之ApplicationContext的事件机制

    1、通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。

         如果容器中有一个ApplicationListener bean,当ApplicationContext发布ApplicationEvent时,ApplicationListener bean将自动被触发。

    2、spring的事件框架的两个重要成员(即Event、Listener):

         1》ApplicationEvent:容器事件,必须由ApplicationContext发布。

         2》ApplicationListener:监听器,可由容器中的任何监听器bean担任。

         事件机制中的3要素:事件源(ApplicationContext)、事件(Event)、事件监听器(Listener)。

         Event事件——>ApplicationContext事件源发布事件——>触发Listener监听器——>监听器执行内部onApplicationEvent(ApplicationEvent e)方法,Event事件作为传入参数。

         由上面的流程可知,只需要在容器中注册实现了ApplicationListener的bean,当ApplicationContext发布事件的时候,就会被监听器自动捕获了。

         beans.xml注册事件监听器实示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
          <!-- 配置监听器 -->
          <bean class="com.lfy.listener.EmailNotifier"/>
    </beans>

         实现ApplicationListener接口的简单EmailNotifier.java示例代码如下:

    package com.lfy.listener;
    
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    
    import com.lfy.event.EmailEvent;
    
    /**
     * 容器事件的监听器类
     * @author lfy
     *
     */
    public class EmailNotifier implements ApplicationListener {
        //该方法会在容器发生事件时自动触发
        @Override
        public void onApplicationEvent(ApplicationEvent evt) {
            //只处理EmailEvent,模拟发送email通知
            if(evt instanceof EmailEvent) {
                EmailEvent emailEvent=(EmailEvent)evt;
                System.out.println("需要发送邮件的接收地址 "+emailEvent.getAddress());
                System.out.println("需要发送邮件的邮件正文 "+emailEvent.getText());
            }else {
                //其他事件不做任何处理
                System.out.println("其他事件:"+evt);
            }
        }
    }

        继承ApplicationEvent的简单事件java bean举例EmailEvent.java

    package com.lfy.event;
    
    import org.springframework.context.ApplicationEvent;
    
    /**
     * ApplicationContext的事件机制
     * 只要一个java类继承了ApplicationEvent基类,则该类的对象
     * 就可以作为spring容器的容器事件
     * @author lfy
     * 
     */
    public class EmailEvent extends ApplicationEvent {
       private String address;
       private String text;
       
       public String getAddress() {
           return address;
       }
       public void setAddress(String address) {
           this.address = address;
       }
       public String getText() {
           return text;
       }
       public void setText(String text) {
           this.text = text;
       }
       
       public EmailEvent(Object source) {
           super(source);
       }
       //初始化全部成员变量的构造器
       public EmailEvent(Object source,String address,String text) {
           super(source);
           this.address=address;
           this.text=text;
       }
       
    }

         简单的ApplicationContext事件源演示,用于发布事件,触发监听器执行处理:

         SpringListenerTest.java

    package com.lfy.main;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.lfy.event.EmailEvent;
    
    public class SpringListenerTest {
    
        public static void main(String[] args) {
            //创建spring容器
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            EmailEvent ele=new EmailEvent("test","spring_test@163.com","this is a test");
            //发布容器事件
            ctx.publishEvent(ele);
        }
    
    }

        执行结果:

       注:上面运行结果中的“其他事件”,是因为当系统创建spring容器、加载spring容器、容器销毁时会自动触发容器事件(内置事件),容器事件监听器可以监听到这些事件。ApplicationContext的publishEvent(...)用于主动触发指定Event事件的容器事件。

       如果想让bean中业务过程发布指定容器事件,则应该先让bean获得ApplicationContext容器的引用,然后将指定容器事件Event交由ApplicationContext发布。spring-让bean获取所在的容器

    3、spring的提供的内置事件:

         1》ContextRefreshedEvent:ApplicationContext容器初始化或刷新触发该事件。此处说的初始化,是指所有的bean被成功加载,后处理的bean被检测激活,所有的singleton bean被预初始化,ApplicationContext容器已就绪可用。

         2》ContextStartdEvent:当使用ApplicationContext的子接口ConfigurableApplicationContex接口的start()方法启动ApplicationContext容器时触发该事件。容器管理生命周期的bean实例将获得一个指定的启动信号,这在经常需要停止后重新启动的场合比较常见。

         3》ContextClossedEvent:当使用ConfigurableApplicationContex接口的close()方法关闭ApplicationContext容器时触发该事件。

         4》ContextStoppedEvent:当使用ConfigurableApplicationContex接口的stop()方法使ApplicationContext容器停止时触发该事件 。此处的“停止”意味着,容器管理生命周期的bean实例将获得一个指定的停止信号。被停止的spring容器可以再次通过调用start()方法重新启动。

         5》RequestHandledEvent:Web相关的事件,只能应用于使用DispatcherServlet的Web应用中。在使用spring作为前端的MVC控制器时,当spring处理用户请求结束后,系统会自动触发该事件。

  • 相关阅读:
    CSS-常用hack
    CSS触发haslayout的方法
    CSS最大最小宽高兼容
    CSS-文字超出自动显示省略号
    [LeetCode][JavaScript]Number of Islands
    [LeetCode][JavaScript]Search a 2D Matrix II
    [LeetCode][JavaScript]Search a 2D Matrix
    [LeetCode][JavaScript]Candy
    [LeetCode][JavaScript]Wildcard Matching
    [LeetCode][JavaScript]Sliding Window Maximum
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11324173.html
Copyright © 2011-2022 走看看