当前位置: 首页 > 后端技术 > Java

SpringFramework的事件机制

时间:2023-04-01 14:52:23 Java

观察者模式观察者模式定义:多个对象之间存在一对多的依赖关系。当其中一个对象的状态发生变化时,必须通知依赖它的所有对象并进行相应处理。.依赖对象就是目标对象,或者说事件源,其他对象称为观察者,目标对象的状态变化称为事件。观察者模式的适用场景具体的观察者对象不明确,或者编码阶段不清楚。实现方法对主体(subject)或抽象目标类进行抽象,提供添加和移除观察者对象的方法,以及通知所有观察者的方法。具体主体或目标实现类,实现抽象目标的所有抽象方法。观察者(Observer)接口提供了接收通知的方法,在接收到主体的通知方法时调用。具体观察者(ConcreteObserver),观察者接口的实现类。基于以上结构,我们可以在代码中快速实现一个观察者模式的简单应用。JDK也提供了观察者模式的实现,不过今天我们主要讨论Spring框架的实现,就不讨论前者了。Spring框架实现了观察者模式,方便程序员调用。Spring提供了现成的观察者模式,程序员不再需要自己编写代码来实现观察者模式。只需要几个简单的步骤就可以在Spring中实现它。Spring提供了以下组件:ApplicationEvent:事件抽象类,通过扩展该类实现用户事件。ApplicationEventPublisherAware:事件发布者接口。用户的目标类通过实现该接口,通过Spring框架完成事件发布。ApplicationListener观察者(listener)接口,用户通过该接口监听事件发布者发布的ApplicationEvent事件。该接口只有一个方法:voidonApplicationEvent(Eevent),由Spring容器接收到事件发布者后释放。在相应的事件之后调用。@EventListener:注解实现的观察者(监听器),与ApplicationListener接口的功能和作用相同。最简单有效的解释就是举例。下面的例子说明了Spring事件机制的具体实现。我们先假设一个场景:用户类userService有一个用户注册方法userRegister。注册成功后,我们需要通过短信、微信等不同方式向相关方发送通知。根据Spring事件机制的实现,我们首先需要定义用户注册事件:publicclassuserRegisterEventextendsApplicationEvent{privateuserServiceuserService;/***创建一个新的{@codeApplicationEvent}。**@paramsource事件最初发生的对象或与*事件关联的对象(永远不会{@codenull})*///通过实现ApplicationEvent接口创建事件publicuserRegisterEvent(Objectsource){super(来源);this.userService=(userService)来源;}}userService类是用户服务类。根据上面的约定,userService类提供了用户注册的方法。因为我们需要在用户注册成功后发出通知,所以userService需要具备发布事件的能力,需要实现ApplicationEventPublisherAware接口:@Component@Slf4jpublicclassuserServiceimplementsApplicationEventPublisherAware{//定义事件发布者ApplicationEventPublisherpublisher;公共字符串名称;//默认是单例bean,会在容器初始化时创建并初始化publicuserService(){System.out.println("userServiceconstructed...");}//自定义事件发布方式,绑定到应用程序,应用程序的特定事件完成后,通过容器的事件发布者将事件发布到容器中publicvoiduserRegister(StringuserName){log.info("用户注册成功");this.setName(userName);publisher.publishEvent(newuserRegisterEvent(this));}//实现事件发布者的方法,获取容器中的事件发布者@OverridepublicvoidsetApplicationEventPublisher(ApplicationEventPublisherapplicationEventPublisher){this.publisher=applicationEventPublisher;}publicStringgetName(){returnthis.name;}publicvoidsetName(Stringname){this.name=name;}}剩下的就是实现观察者了,从上面介绍一下,我们知道Spring有两种实现观察者的方式,一是通过ApplicationListener来实现观察者。为了简化逻辑,监听到用户事件后,我们简单打印一下:@Component@Slf4jpublicclassUserReigisterListenerimplementsApplicationListener{//通过实现ApplicationListener接口,监听容器中发布的具体事件@OverridepublicvoidonApplicationEvent(userRegisterEventevent){userServiceuser=(userService)event.getSource();if(user!=null){log.info("我收到一条来自userService的消息:"+user.getName());}}}通过注解实现监听器:@Component@Slf4jpublicclassSmsSendListener{@EventListener@Order(0)publicvoidonRegister(userRegisterEventevent){userServiceuser=(userService)event.getSource();if(user!=null){log.info("我将发送短信给:"+user.getName());}}}完成,准备测试。编写启动类,测试:@Slf4jpublicclassApp{publicstaticvoidmain(String[]args){ApplicationContextctx=newAnnotationConfigApplicationContext(commonConfig.class);//获取userService实例userServiceus=ctx.getBean("userService",userService.class);us.userRegister("张三");}}Running:22:50:33.538[main]INFOorg.example.service.SmsSendListener-我将发送短信至:Zhangsan22:50:33.538[main]INFOorg.example.service.UserReigisterListener-我有一条消息来自userService:Zhangsan从打印结果可以看出,userService类的方法userRegister通过调用Spring框架的事件发布者通知用户张三注册成功的信息,有两个监听器(观察者)。这样我们通过Spring框架非常简单的实现了观察者模式,将用户注册成功的消息传递给观察者。不同的观察者可以根据业务需求做出不同的反应。而且,无论是通过实现接口还是使用注解,我们都可以很方便的注册多个观察者。比如我们可以快速实现微信通知、邮件通知等的观察者。关键是添加观察者不需要与事件源(目标类,如上例中的用户服务类)进行任何耦合,也不需要对目标类做任何改动。后续分析Spring框架事件机制的原理。