简单的说,观察者模式,就类似于 广播站发送广播,和收音机的关系。多个收音机去收听同一个广播频道。 在实际的业务场景中,可以是这样的。创建订单成功后,发布事件。然后减库存。发送短信。调用微信。调用物流服务。等多个后续业务,都去监听同一个事件。

  定义一个事件。

package com.study.design.observer.spring;

import org.springframework.context.ApplicationEvent;

/**
* 定义事件
*/ public class OrderEvent extends ApplicationEvent {
public OrderEvent(Object source) {
super(source);
}
}

  定义事件发布器

package com.study.design.observer.spring;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.stereotype.Service; // 事件发布器。把事件发布到 spring容器中。 @Service
public class OrderPublish implements ApplicationContextAware { private ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 获取spring容器,设置到私有属性。
this.applicationContext = applicationContext;
} // 调用spring容器 发布事件
public void publishEvent(ApplicationEvent event){
applicationContext.publishEvent(event);
} }

  订单服务中,发布事件

package com.study.design.observer.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* 订单操作,业务伪代码
*/
@Service
public class OrderService { // 注入事件发布器
@Autowired
private OrderPublish orderPublish; /**
* 电商 - 新订单订单
*/
public void saveOrder() { System.out.println("1、 订单创建成功"); // 创建事件 ,可以设置参数
OrderEvent orderEvent = new OrderEvent(123456); // 发布事件
orderPublish.publishEvent(orderEvent); }
}

  发短信  监听器 服务

package com.study.design.observer.spring;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component; // 监听器 ,有事件发布后,才会执行
@Component
public class SmsListener implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) { // 获取事件中的参数。
System.out.println("event.getSource的值是:"+event.getSource()); // 2---短信通知
System.out.println("2、 调用短信发送的接口 -> 恭喜喜提羽绒被子");
}
}

  如此,就可以创建多个监听器,进行不同的业务处理。这就是观察者模式。

基于spring的观察者模式的更多相关文章

  1. 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...

  2. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  3. step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework

    文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...

  4. 基于Spring MVC的Web应用开发(三) - Resources

    基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...

  5. Spring实战5:基于Spring构建Web应用

    主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...

  6. 基于Spring设计并实现RESTful Web Services(转)

    基于Spring设计并实现RESTful Web Services 在本教程中,你将会使用Spring来创建一个具有生产力的RESTful网络服务. 为什么用RESTful网络服务? 从和Amazon ...

  7. RESTLET开发实例(三)基于spring的REST服务

    http://www.lifeba.org/arch/restlet_spring_3.html 前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将 ...

  8. [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务

    前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将介绍restlet如何整合spring框架进行开发.Spring 是一个开源框架,是为了解决企业应 ...

  9. 构建一个基于 Spring 的 RESTful Web Service

    本文详细介绍了基于Spring创建一个“hello world” RESTful web service工程的步骤. 目标 构建一个service,接收如下HTTP GET请求: http://loc ...

随机推荐

  1. 在java项目启动时就执行某操作

    在java启动时大概有四种,此处只介绍3种 1.在启动的方法上使用通过@PostConstruct方法实现初始化bean进行操作 2.通过bean实现InitializingBean接口 @Overr ...

  2. java与WebService对接案例--生成代码方法

    前端时间出差做项目,因为我们给对三方工厂做Mes项目,其中有一个报工环节,需要我们的Mes中将产品提交到他们的U9(Erp)上,但是由于u9是用友的产品,用c#写的,而我是用java写的,那么WebS ...

  3. json数据转为对象,一般在前台把数据传回后端中使用 转https://www.cnblogs.com/zxtceq/p/6610214.html

    public static JArray GetData2JArray(string url, string key) { string jsonData = HttpHelper.HttpGet(u ...

  4. 并发编程-concurrent指南-回环栅栏CyclicBarrier

    字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行. java.util.concurrent.CyclicBarrier 类是一种同步机制,它能够对处理一些算法的线程实现同步 ...

  5. django基础知识之HTML转义:

    HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/in ...

  6. 如何用ModelSim对Xilinx ISE产生的网表进行仿真

    图: 在对设计的芯片进行测试时,经常要用到FPGA,可是里面的仿真工具却不如Modelsim那么好用,且在规模比较大时,ISE在仿真时,软件经常会报告内存限制的问题,此时一般会切换到Modelsim软 ...

  7. python进阶--字典排序

    zip()函数 sorted() 要求对字典中,按值的大小排序 解决方案: 利用zip函数 zip函数介绍: zip函数可以将可迭代对象打包成一个个元组,在python3中返回一个对象,在python ...

  8. 你懂什么叫js继承吗

    说到继承呢?肯定有很多做java的朋友都觉得是一个比较简单的东西了.毕竟面向对象的三大特征就是:封装.继承和多态嘛.但是真正对于一个javascript开发人员来说,很多时候其实你使用了继承,但其实你 ...

  9. python连接greenplum_postgresql

    1. 场景描述 使用python连接greenplum或者postgresql. 2. 解决方案 2.1 真实代码 2.1.1 调用类 import dbgp as dbgp # 执行 def exe ...

  10. 关于Linux服务器配置java环境遇到的问题

    关于Linux服务器配置java环境遇到的问题 将下载好的JDK安装包解压到/etc/local/路径下,安装完后用vim/etc/profile文件,在文件末尾添加 export JAVA_HOME ...