千家信息网

基于Spring实现观察者模式的方法步骤

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"基于Spring实现观察者模式的方法步骤",在日常操作中,相信很多人在基于Spring实现观察者模式的方法步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年01月16日基于Spring实现观察者模式的方法步骤

这篇文章主要介绍"基于Spring实现观察者模式的方法步骤",在日常操作中,相信很多人在基于Spring实现观察者模式的方法步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"基于Spring实现观察者模式的方法步骤"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,其主要解决一个对象状态改变给其他关联对象通知的问题,保证易用和低耦合。一个典型的应用场景是:当用户注册以后,需要给用户发送邮件,发送优惠券等操作,如下图所示。

UserService 在完成自身的用户注册逻辑之后,仅仅只需要发布一个 UserRegisterEvent 事件,而无需关注其它拓展逻辑。其它 Service 可以自己订阅 UserRegisterEvent 事件,实现自定义的拓展逻辑。Spring的事件机制主要由3个部分组成。

  • ApplicationEvent:通过继承它,实现自定义事件。另外,通过它的 source 属性可以获取事件源,timestamp 属性可以获得发生时间。

  • ApplicationEventPublisher:通过实现它,来发布变更事件。

  • ApplicationEventListener:通过实现它,来监听指定类型事件并响应动作。这里就以上面的用户注册为例,来看看代码示例。首先定义用户注册事件 UserRegisterEvent。

publicclass UserRegisterEvent extends ApplicationEvent {    /**     * 用户名     */    private String username;    public UserRegisterEvent(Object source) {        super(source);    }    public UserRegisterEvent(Object source, String username) {        super(source);        this.username = username;    }    public String getUsername() {        return username;    }}

然后定义用户注册服务类,实现 ApplicationEventPublisherAware 接口,从而将 ApplicationEventPublisher 注入进来。从下面代码可以看到,在执行完注册逻辑后,调用了 ApplicationEventPublisher的 publishEvent(ApplicationEvent event) 方法,发布了 UserRegisterEvent 事件。

@Servicepublicclass UserService implements ApplicationEventPublisherAware { // <1>    private Logger logger = LoggerFactory.getLogger(getClass());    private ApplicationEventPublisher applicationEventPublisher;    @Override    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {        this.applicationEventPublisher = applicationEventPublisher;    }    public void register(String username) {        // ... 执行注册逻辑        logger.info("[register][执行用户({}) 的注册逻辑]", username);        // <2> ... 发布        applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username));    }}

创建邮箱Service,实现 ApplicationListener 接口,通过 E 泛型设置感兴趣的事件,实现 onApplicationEvent(E event) 方法,针对监听的 UserRegisterEvent 事件,进行自定义处理。

@Servicepublicclass EmailService implements ApplicationListener { // <1>    private Logger logger = LoggerFactory.getLogger(getClass());    @Override    @Async// <3>    public void onApplicationEvent(UserRegisterEvent event) { // <2>        logger.info("[onApplicationEvent][给用户({}) 发送邮件]", event.getUsername());    }}

创建优惠券Service,不同于上面的实现 ApplicationListener 接口方式,在方法上,添加 @EventListener 注解,并设置监听的事件为 UserRegisterEvent。这是另一种使用方式。

@Servicepublicclass CouponService {    private Logger logger = LoggerFactory.getLogger(getClass());    @EventListener// <1>    public void addCoupon(UserRegisterEvent event) {        logger.info("[addCoupon][给用户({}) 发放优惠劵]", event.getUsername());    }}

看到这里,细心的同学可能想到了发布订阅模式,其实观察者模式于发布订阅还是有区别的,简单来说,发布订阅模式属于广义上的观察者模式,在观察者模式的 Subject 和 Observer 的基础上,引入 Event Channel 这个中介,进一步解耦。图示如下,可以看出,观察者模式更加轻量,通常用于单机,而发布订阅模式相对而言更重一些,通常用于分布式环境下的消息通知场景。

到此,关于"基于Spring实现观察者模式的方法步骤"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0