本日来简朴地聊聊事件驱动,其实写这篇文章挺令我挺苦恼的,因为事件驱动这个名词,我没有找到很好的定性表明,担忧本身的表述有误,而说到事件驱动大概立即遐想到如此浩瀚的观念:调查者模式,劳务派遣管理系统,宣布订阅模式,动静行列MQ,动静驱动,事件,EventSourcing…为了不发生歧义,笔者把本身所相识的这些迷糊其词的观念都列了出来,再开始本日的分享。
本文涵盖的内容主要是前面4点。
Spring对Event的支持
Spring的文档对Event的支持翻译之后描写如下:
ApplicationContext通过ApplicationEvent类和ApplicationListener接口举办事件处理惩罚。 假如将实现ApplicationListener接口的bean注入到上下文中,则每次利用ApplicationContext宣布ApplicationEvent时,城市通知该bean。 本质上,这是尺度的调查者设计模式。
而在spring4.2之后,提供了注解式的支持,我们可以利用任意的java工具共同注解到达同样的结果,首先来看看不合用注解如安在Spring中利用事件驱念头制。
界说业务需求:用户注册后,系统需要给用户发送邮件奉告用户注册乐成,需要给用户初始化积分;隐含的设计需求,用户注册后,后续需求大概会添加其他操纵,如再发送一条短信等等,但愿措施具有扩展性,以及切合开闭原则。
假如不利用事件驱动,代码大概会像这样子:
public class UserService { @Autowired EmailService emailService; @Autowired ScoreService scoreService; @Autowired OtherService otherService; public void register(String name) { System.out.println("用户:" + name + " 已注册!"); emailService.sendEmail(name); scoreService.initScore(name); otherService.execute(name); } }
要说有什么短处,其实也不算有,因为大概大大都人在开拓中城市这么写,喜欢写同步代码。但这么写,实际上并不是出格的切合隐含的设计需求,假设增加更多的注册项service,我们需要修改register的要领,而且让UserService注入对应的Service。而实际上,register并不体贴这些“特别”的操纵,如何将这些多余的代码抽取出去呢?便可以利用Spring提供的Event机制。
界说用户注册事件
public class UserRegisterEvent extends ApplicationEvent{ public UserRegisterEvent(String name) { //name即source super(name); } }
ApplicationEvent是由Spring提供的所有Event类的基类,为了简朴起见,注册事件只通报了name(可以巨大的工具,但留意要相识清楚序列化机制)。
界说用户注册处事(事件宣布者)
@Service // <1> public class UserService implements ApplicationEventPublisherAware { // <2> public void register(String name) { System.out.println("用户:" + name + " 已注册!"); applicationEventPublisher.publishEvent(new UserRegisterEvent(name));// <3> } private ApplicationEventPublisher applicationEventPublisher; // <2> @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { // <2> this.applicationEventPublisher = applicationEventPublisher; } }
<1> 处事必需交给Spring容器托管
<2> ApplicationEventPublisherAware是由Spring提供的用于为Service注入ApplicationEventPublisher事件宣布器的接口,利用这个接口,我们本身的Service就拥有了宣布事件的本领。
<3> 用户注册后,不再是显示挪用其他的业务Service,软件开发,而是宣布一个用户注册事件。