为什么要使用java中的事件机制
应用场景类型:
1. 用户注册成功后,此时需要做以下这么多事情:
1. 加积分
2. 发确认邮件
3. 如果时游戏帐户,此时赠送游戏大礼包
耦合性高的解决办法:
1. 创建一个UserService 并对每一个功能都添加一个方法,这样耦合非常严重,以后增加一个给用户发短信提醒的功能,则可能需要再添加一个Service来进行处理,也不方便后期的维护
低耦合的事件驱动模型的解决方法:
1. 首先时一种对象间的一种一对多的关系;最简单的如交通信号灯,信号灯时目标(相当于用户注册),行人注视着信号灯(相当于加积分,发确认邮件等)。
2. 当信号灯发送对应的颜色(发布),观察者(行人)就可以接受到改变。
3. 观察者时如何进行处理的(如行人如何走,走的快还是慢,目标不会进行管理),目标不需要进行干涉;此时就松耦合了他们之间的关系
增加了一个Event事件来解耦UserController和其他服务,及用户注册后,只需要发送这个事件,监听器监听到后进行处理即可,以后要再添加或删除某些功能非常的方便
通过Spring提供的@EventListener注解和@Async快速实现异步或同步之间的调用
1. controller层,添加用户的控制层
@Slf4j
@RestController
@RequestMapping(value = "/user",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class AppController {
@Resource
private ApplicationEventPublisher publisher;
@PostMapping(value = "/addUser")
public User addUser(@RequestBody User user){
String username = user.getUsername();
log.info("【用户名称为】:{}"+username);
publisher.publishEvent(new UserCreationEvent(user));
return user;
}
}
2. 接受的实体类
@Data
public class User {
private String username;
private String password;
private String email;
private Integer integral;
}
3. 添加事件
public class UserCreationEvent extends ApplicationEvent {
public UserCreationEvent(Object source) {
super(source);
}
public User getUser(){
Preconditions.checkState( source != null);
return (User) this.source;
}
}
4. 通过@EventListener监听事件
@Component
@Slf4j
@EnableAsync
public class CreationListener {
@EventListener
@Async
public void onUserAddEvent(UserCreationEvent event) {
User user = event.getUser();
log.info("--------------------------------------");
log.info("开始添加当前用户了");
log.info(user.toString());
}
@EventListener
@Async
public void onUserAddIntegralEvent(UserCreationEvent event) {
User user = event.getUser();
log.info("--------------------------------------");
log.info("开始添加积分了");
user.setIntegral(1000);
log.info(user.toString());
}
@EventListener
@Async
public void onUserSendEmailEvent(UserCreationEvent event) {
User user = event.getUser();
log.info("--------------------------------------");
log.info("开始发送邮件了");
log.info(user.toString());
}
@EventListener
@Async
public void onUserSendGameGiftPackagesEvent(UserCreationEvent event){
User user = event.getUser();
log.info("--------------------------------------");
log.info("开始赠送游戏大礼包了");
log.info(user.toString());
}
}
5.查看答应出的日志