分析需求引入事件机制
使用spring的事件机制有助于对我们的项目进一步的解耦。假如现在我们面临一个需求:
我需要在用户注册成功的时候,根据用户提交的邮箱、手机号信息,向用户发送邮箱认证和手机号短信通知。传统的做法之一是在我们的UserService层注入邮件发送和短信发送的相关类,然后在完成用户注册同时,调用对应类方法完成邮件发送和短信发送
但这样做的话,会把我们邮件、短信发送的业务与我们的UserService的逻辑业务耦合在了一起。耦合造成的常见缺点是,我(甚至假设很频繁的)修改了邮件、短信发送的API,我就可能需要在UserService层修改相应的调用方法,但这样做人家UserService就会很无辜并吐槽:你改邮件、短信发送的业务,又不关我的事,干嘛老改到我身上来了?这就是你的不对了。
对呀!根据职责分明的设计原则,人家UserService就只该管用户管理部分的业务逻辑,你老让它干别人干的事,它当然不高兴了!
那该怎么拌?凉拌?不不不。。。我们可以通过spring的事件机制来实现解耦呀。利用观察者设计模式,设置监听器来监听userService的注册事件(同时,我们可以很自然地将userService理解成了事件发布者),一旦userService注册了,监听器就完成相应的邮箱、短信发送工作(同时,我们也可以很自然地将发送邮件、发送短信理解成我们的事件源)。这样userService就不用管别人的事了,只需要在完成注册功能时候,当下老大,号令手下(监听器),让它完成短信、邮箱的发送工作。
spring的事件通信常按下列流程进行
事件实例分析
在这里面,我们涉及到三个主要对象:事件发布者、事件源、事件监听器。根据这三个对象,我们来配置我们的注册事件实例:
1. 定义事件源
利用事件通信的第一步往往便是定义我们的事件。在spring中