• 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 等

  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/snow-man/p/12392838.html
Copyright © 2020-2023  润新知