我们都知道Spring中的事务
,简单来说,可以用一个注解 @Transactional
来搞定。但是,你听过Spring中还有一个名叫事件
的东西吗?事务与事件只有一字之差,那么事件又有什么作用呢,又该在哪些场景下使用。接下来,让我们一起入门Spring中的事件发布监听机制!
种一棵树最好的时间是10年前,其次就是现在,加油!
--by蜡笔小柯南
适用场景
- 异步处理
例如用户注册成功后,异步发送邮件、短信通知,或记录日志。通过事件机制,主流程无需等待耗时操作,提升响应速度。 - 业务解耦
当多个业务逻辑需要响应同一操作时(如订单支付后更新库存、发送通知、生成报表),事件机制将核心逻辑与扩展逻辑解耦,避免代码臃肿。 - 数据变更通知
数据库增删改后,触发缓存更新、数据同步等操作。例如:用户信息修改时,通知其他系统更新缓存。 - 系统监控与审计
关键操作(如登录失败、支付异常)触发事件,供监控系统实时收集并告警。 - 插件化扩展
允许第三方模块通过监听事件实现功能扩展,无需修改核心代码(如电商平台的促销插件)
核心优势
优势 | 说明 |
---|---|
松耦合 | 发布者与监听者无直接依赖,通过事件对象交互,降低模块耦合度 |
可扩展性 | 新增业务只需添加监听器,无需修改原有代码(符合开闭原则) |
异步处理能力 | 结合@Async注解,轻松实现异步执行,提升吞吐量 |
代码可维护性 | 逻辑拆分到独立监听器中,职责单一,代码更清晰易维护 |
事务边界管理 | 可结合@TransactionalEventListener,在事务提交后触发监听逻辑 |
代码实现
需求:比如,我们有一个用户注册的服务,当用户注册成功后,需要给用户发送短信和邮件
我们传统的处理方式,一般是这样:先处理用户注册,注册完成后,发送短信,发送验证码。
public class UserServiceImpl implements UserService {
@Override
public String registerUser(RegisterInfo registerInfo) {
// 用户注册处理逻辑...
// 向用户发送短信
// 向用户发送邮件
}
}
即,在注册成功后的逻辑下,继续添加其他代码,这会使我们代码的耦合性大大提高,开发中遵循的原则是,低耦合,如果后续还需要再添加新的逻辑,如:发送一些订阅通知、APP消息通知等等,就还需要在此后续添加其他代码,会使整个代码结果变的更庞大,更冗余,更不易维护。
下面,我们使用事件机制来优化一下。
结构搭建
Controller层
register()方法是一个用户注册方法
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/register")
public String register(@RequestParam(name = "name",required = false) String name, @RequestParam(name = "email", required = false) String email, @RequestParam(name = "phone", required = false) String phone) {
RegisterInfo registerInfo = null