Spring的ApplicationEventPublisher推送事件体验

 2023-02-10
原文作者:apengcxjt 原文地址:https://juejin.cn/post/7004706448953327629

今天闲来无事翻看国内对微服务封装的还不错的pig源码,看到了封装了一个工具类里边用到了Spring的ApplicationEventPublisher也就是今天这篇文章的主人公,源于对这个类不知道是干嘛的,在百度了一下后顺便记录一下,可能后期会用的上

  • ApplicationEventPublisher是publishEvent实现异步快速
  • 使用ApplicationEventPublisher的publishEvent来发布事件

这个一开始感觉和mq有点类似的,mq就是发送消息,在接收消息,而这个是推送事件,在监听事件.这里我进行模拟一个插入用户的时候将这个用户的信息作为事件推送最后进行打印

废话不多说,直接上代码

  1. 创建用户实体类UserDTO
    /**
     * @author 阿鹏
     * @date 2021/9/3 13:55
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserDTO {
        private String name;
        private String sex;
    }
  1. 创建一个service,这里模拟一下,并不是service,只要能注入到spring容器中,能让我在测试类中运行就行哈哈
    /**
     * @author 阿鹏
     * @date 2021/9/3 13:56
     * 假设这个类是service类 这里需要模拟一个保存用户的方法 然后发送事件并去监听
     */
    @Component
    @RequiredArgsConstructor
    public class ApplicationEventSender {
    
        private final ApplicationEventPublisher publisher;
    
        public void saveUser(UserDTO dto) {
    		// 推送事件
            publisher.publishEvent(dto);
        }
    }
  1. 使用监听的类监听事件,这里使用的注解是@EventListener,里边的属性自己去研究一下吧,这里我使用的是condition属性,就是满足就执行不满足不执行,里边的表达式是spring的spel表达式
    /**
     * @author 阿鹏
     * @date 2021/9/3 14:17
     */
    @Component
    public class EventListenerDemo {
    
        @EventListener(condition = "#user.name!=null")
        public void watch(UserDTO user) {
    		// 如果user的name是null的话,下边都不会执行
            System.out.println(user.getName());
            System.out.println(user.getSex());
        }
    }
  1. 进行测试
        @Autowired
        private ApplicationEventSender sender;
    
        @Test
        public void testSpringWatch() {
            sender.saveUser(UserDTO.builder()
                    .name("阿鹏从小就淘")
                    .sex("男")
                    .build());
        }