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

    转自:https://www.littleteacher.cn/archives/spring-zhong-de-shi-jian-ji-zhi-applicationeventpublishe

    需求

    当用户注册后,给他发送一封邮件通知他注册成功了,然后给他初始化积分,再发放一张新用户注册优惠券等。

    用户注册事件

    public class UserRegisterEvent extends ApplicationEvent{
        public UserRegisterEvent(String name) { //name即source 复杂的对象,但注意要了解清楚序列化机制
            super(name);
        }
    }
    

    用户注册服务发布者

    @Service
    public class UserService  {
    	
        @Autowired
        private ApplicationEventPublisher applicationEventPublisher;
    
        public void register(String name) {
            System.out.println("用户:" + name + " 已注册!");
            applicationEventPublisher.publishEvent(new UserRegisterEvent(name));
        }
    }
    

    注意:再Spring中,服务必须交给 Spring 容器托管。ApplicationEventPublisherAware 是由 Spring 提供的用于为 Service 注入 ApplicationEventPublisher 事件发布器的接口,使用这个接口,我们自己的 Service 就拥有了发布事件的能力。用户注册后,不再是显示调用其他的业务 Service,而是发布一个用户注册事件。

    创建事件订阅者(邮件服务、积分服务等)

    @Service
    public class EmailService implements ApplicationListener<UserRegisterEvent> {
        @Override
        public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
            System.out.println("邮件服务接到通知,给 " + userRegisterEvent.getSource() + " 发送邮件...");
        }
    }
    

    注意:事件订阅者的服务同样需要托管于 Spring 容器,ApplicationListener接口是由 Spring 提供的事件订阅者必须实现的接口,我们一般把该 Service 关心的事件类型作为泛型传入。处理事件,通过 event.getSource() 即可拿到事件的具体内容,在本例中便是用户的姓名。

    SpringBoot 测试启动类

    @SpringBootApplication
    @RestController
    public class EventDemoApp {
        public static void main(String[] args) {
            SpringApplication.run(EventDemoApp.class, args);
        }
        @Autowired
        UserService userService;
        @RequestMapping("/register")
        public String register(){
            userService.register("zhangsan");
            return "success";
        }
    }
    

    完成

    至此, 完成需求,后期无论如何扩展,我们只需要添加相应的事件订阅者即可。

  • 相关阅读:
    斜率优化dp学习
    拓扑排序
    P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)
    网络流24题!!!!
    费用流板子
    网络流dinic板子
    小花梨的数组
    C. 小花梨判连通
    splay树
    hdu4467 graph
  • 原文地址:https://www.cnblogs.com/sharpest/p/13712637.html
Copyright © 2011-2022 走看看