观察者模式观察者模式定义:多个对象之间存在一对多的依赖关系。当其中一个对象的状态发生变化时,必须通知依赖它的所有对象并进行相应处理。.依赖对象就是目标对象,或者说事件源,其他对象称为观察者,目标对象的状态变化称为事件。观察者模式的适用场景具体的观察者对象不明确,或者编码阶段不清楚。实现方法对主体(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
