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

    Spring 

    事件机制的主要成员:  

    1. 事件(继承自ApplicationEvent)
    2. 事件监听器(两种方式,一种继承自接口ApplicationListener, 另一种是使用@Listener注解)
    3. 事件源(发布事件)【两种方式,一是使用ApplicationEventPublisher,二是使用ApplicatonContext(其后台)】

    Demo:

    用户定义,自定义事件定义

    @Data
    public class User {
        private Long id;
    
        private String name;
    
        public User(Long id, String name) {
            this.id = id;
            this.name = name;
        }
    }
    
    //user event
    public class UserAddedEvent extends ApplicationEvent {
        public UserAddedEvent(Object source) {
            super(source);
        }
    }

    //两种发布消息方式

    @Service("eventUserService")
    public class UserService implements ApplicationContextAware, ApplicationEventPublisherAware {
    
        private ApplicationContext applicationContext;
        private ApplicationEventPublisher applicationEventPublisher;
    
        //使用 ApplicationContext 发布消息
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        //使用 ApplicationEventPublisher 发布消息
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
            this.applicationEventPublisher = applicationEventPublisher;
        }
    
        public String addUser(User user) {
            // 保存用户
            user.setId(1L);
            user.setName("name-1");
            // 发生事件(发邮件、发短信、、、)
    //        applicationContext.publishEvent(new UserAddedEvent(user));
            // 两种发生方式一致
            applicationEventPublisher.publishEvent(new UserAddedEvent(user));
            return "ok";
        }
    }

    //两种监视器

    //1. 实现 接口ApplicationListener

    @Component
    public class NotifySelfListenr implements ApplicationListener<UserAddedEvent> {
    
        @Override
        public void onApplicationEvent(UserAddedEvent userAddedEvent) {
            //根据类型匹配,
            // 只监视UserAddedEvent 事件
            System.out.println("self event " + userAddedEvent.getClass().toString());
        }
    }
    
    
    ///全局监视
    @Component
    public class GlobalNotifyListenr implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
    
            //监听所有事件,全局事件
            System.out.println("GlobalNotifyListenr  " + event.getClass().toString());
    
        }
    
    }

    //2.实现用注解 @EventListener

    @Component
    public class UserListener {
    
        @EventListener
        public void getUserEvent(UserAddedEvent userEvent) {
            System.out.println("getUserEvent-接受到事件:" + userEvent);
        }
    
        @EventListener
        public void getUserEvent2(UserAddedEvent userEvent) {
            System.out.println("getUserEvent2-接受到事件:" + userEvent);
        }
    }

    //运行代码

    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
    
         ConfigurableApplicationContext context= SpringApplication.run(DemoApplication.class, args);
    
            UserService userService = (UserService) context.getBean("eventUserService");
            userService.addUser(new User((long) 11,"abc"));
        }
    
    }

    //结果:

    GlobalNotifyListenr class org.springframework.context.event.ContextRefreshedEvent
    GlobalNotifyListenr class org.springframework.boot.context.event.ApplicationStartedEvent
    GlobalNotifyListenr class org.springframework.boot.context.event.ApplicationReadyEvent
    getUserEvent-接受到事件:com.feilong.com.demo.UserAddedEvent[source=User(id=1, name=name-1)]
    getUserEvent2-接受到事件:com.feilong.com.demo.UserAddedEvent[source=User(id=1, name=name-1)]
    GlobalNotifyListenr class com.feilong.com.demo.UserAddedEvent
    self event class com.feilong.com.demo.UserAddedEvent
    GlobalNotifyListenr class org.springframework.context.event.ContextClosedEvent

     

     

     @EventListener 原理

    @EventListener注解的自定义名称的方法,会在EventListenerMethodProcessor中的afterSingletonsInstantiated()方法中遍历所有 ApplicationContext容器的单利bean。将所有添加了@EventListener的方法注入到ApplicationContext的applicationListeners和初始化的SimpleApplicationEventMulticaster的defaultRetriever.applicationListeners中,在发送事件时候获取监听列表时用。
    ————————————————

    参考博客:https://blog.csdn.net/it_lihongmin/article/details/102940643 等

  • 相关阅读:
    第11周学习进度条
    人月神话阅读笔记03
    人月神话阅读笔记02
    第10周学习进度条
    对各团队的评价意见
    第九周学习进度条
    《构建之法阅读笔记05》
    站立会议10
    第十一周学习进度
    cnblogs.com的用户体验
  • 原文地址:https://www.cnblogs.com/snow-man/p/12392838.html
Copyright © 2011-2022 走看看