热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApplicationEventPublisher异步解耦

2020博客地址汇总2019年博客汇总需求当用户注册后,给他发送一封邮件通知他注册成功了,然后给他初始化积分,再发放一张新用户注册优惠
  • 2020博客地址汇总
  • 2019年博客汇总

需求

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


用户注册事件

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

用户注册服务发布者

@Service
public class UserService {@Autowiredprivate 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 {@Overridepublic 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);}@AutowiredUserService userService;@RequestMapping("/register")public String register(){userService.register("zhangsan");return "success";}
}

推荐阅读
author-avatar
朱衅赝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有