zoukankan      html  css  js  c++  java
  • Spring ApplicationContext事件处理机制

    ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。
    ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的,
    通过ApplicationContext的publishEvent()方法发布到ApplicationListener;
    在这里包含三个角色:被发布的事件,事件的监听者和事件发布者。
    事件发布者在发布事件的时候通知事件的监听者。
    spring的事件需要遵循以下流程:
    (1)自定义事件:继承ApplicationEvent   当前类的作用
    (2)定义事件监听器:实现ApplicationListener
    (3)使用容器发布事件

    代码实现

    1,容器事件

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationEvent;
    
    /**
     * @Description //TODO 容器事件
     * @Author GaoX
     * @Date 2020/6/29 16:33
     */
    public class MessageEvent extends ApplicationEvent {
    
        private String text;
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        public MessageEvent(Object source) {
            super(source);
        }
    
        public MessageEvent(Object source, String text) {
            super(source);
            this.text = text;
        }
    
        public void print(){
            System.out.println("监听器调用此方法!!!!!!!!!!!!");
        }
    
    }

    2,监听器

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description //TODO 监听器
     * @Author GaoX
     * @Date 2020/6/29 16:36
     */
    @Component
    public class MessageListener implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            //此处可以定义多个ApplicationEvent
            if(event instanceof MessageEvent){
                MessageEvent messageEvent = (MessageEvent)event;
                messageEvent.print();
                System.out.println(messageEvent.getSource());
                System.out.println(messageEvent.getText());
            }
        }
    }

    3,事件发布

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Description //TODO 事件发布
     * @Author GaoX
     * @Date 2020/6/29 16:41
     */
    @RestController
    public class MessagePublishEvent {
    
        private ApplicationContext applicationContext;
    
        public MessagePublishEvent(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        @GetMapping("/publishEvent")
        public void publishEvent(String s){
            MessageEvent messageEvent = new MessageEvent("测试发送", "test="+s);
            applicationContext.publishEvent(messageEvent);
        }
    
    }

    控制台打印


     

  • 相关阅读:
    rpm命令之查询是否安装、包详细信息、包安装位置、文件属于哪个包、包依赖
    二进制包之rpm命令方式,安装、更新、卸载、依赖
    vmware之主机/桥接/NAT连接网络、xshell、xftf
    last、lastlog、traceroute、netstat
    ping、防火墙、ifconfig、setup、nmtui、write、wall、mail
    zip、gz、bz2、tar.gz、tar.bz2、jar、unar
    linux 用户管理 groupadd、groupmod、groupdel、gpasswd
    usermod、chage、userdel、su
    useradd、passwd、who、whoami、id、w及用户默认值文件
    文件passwd/shadow/grop/gshadow、邮箱目录、模板目录
  • 原文地址:https://www.cnblogs.com/gaomanito/p/13208860.html
Copyright © 2011-2022 走看看