Spring中的事件机制之观察者模式

为什么要使用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("开始添加当前用户了");
        //TODO 添加用户擦欧总
        log.info(user.toString());
    }


    @EventListener
    @Async
    public void onUserAddIntegralEvent(UserCreationEvent event) {
        User user = event.getUser();
        log.info("--------------------------------------");
        log.info("开始添加积分了");
        //TODO 添加积分的业务逻辑
        user.setIntegral(1000);
        log.info(user.toString());
    }

    @EventListener
    @Async
    public void onUserSendEmailEvent(UserCreationEvent event) {
        User user = event.getUser();
        log.info("--------------------------------------");
        log.info("开始发送邮件了");
        //TODO 添加发送邮件的业务逻辑
        log.info(user.toString());
    }

    @EventListener
    @Async
    public void onUserSendGameGiftPackagesEvent(UserCreationEvent event){
        User user = event.getUser();
        log.info("--------------------------------------");
        log.info("开始赠送游戏大礼包了");
        //TODO 添加赠送游戏大礼包的业务逻辑
        log.info(user.toString());
    }
}

5.查看答应出的日志

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37779570/article/details/81102067
今日推荐