Spring 中的事件机制 ApplicationEventPublisher

需求

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

用户注册事件

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";
    }
}
复制代码

完成

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

posted @   黄进广寒  阅读(667)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示