Spring MapFactoryBean应用详解

2023-05-16

在我们工作中,尤其是电商系统中,一个庞大的电商平台不是一个封闭的平台,往往还伴生着一个开放平台,用以接入各个企业,以实现一种共赢的局面,一般来讲,针对于这种业务场景,首先浮现在开发人员脑海中的往往是工厂模式,但普通的工厂模式使用起来相对比较麻烦,而Spring则给我们提供了一种使用配置方式来扩展工厂,大大简化了我们开发的工作量,同时也做到了不同合作媒体之间的解耦。

下面我们就以一个实际的例子来说一下,比如某个电商要与百度、腾讯、淘宝等大型公司进行接入处理,而接入的功能基本上都是商品、订单、退款等大同小异的业务流程,则此时可以采用工厂模式来设计我们的功能,具体的类结构图如下:


上图是我们简化了的业务模型,其中BaseService实现了公有和基础操作,而BaiduService等则是每家媒体的具体业务实现,如果业务可以直接复用父类的功能的话则无需覆写,比如我们上面只在BaiduService中覆写了order方法。

下面展示了每个类的具体内容:

BaseService.java

package com.mhy.service;

/**
 * @author mhy2011@gmail.com
 * @date 2014年12月8日 下午3:10:12
 */
public class BaseService {

	public void order(){
		System.out.println("BaseService.order执行");
	}
}
内容很简单,只有一句输出,此处只是演示,真实的合作中自然不会是这么简单的。

BaiduService.java

package com.mhy.service;

/**
 * @author mhy2011@gmail.com
 * @date 2014年12月8日 下午3:12:07
 */
public class BaiduService extends BaseService {

	@Override
	public void order() {
		System.out.println("BaiduService.order执行");
	}
}

TencentService.java

package com.mhy.service;

/**
 * 
 * @author mhy2011@gmail.com
 * @date 2014年12月8日 下午3:13:06
 */
public class TencentService extends BaseService {

}
TaobaoService.java

package com.mhy.service;

/**
 * @author mhy2011@gmail.com
 * @date 2014年12月8日 下午3:12:22
 */
public class TaobaoService extends BaseService {

}
如上所示,我们实现了一个基础类以及三个子类,用以区别不同的合作媒体。一般来讲,我们在进行第三方媒体合作时,针对于不同的合作媒体我们都会为其生成一个指定的合作名称,通过该内容我们获取到具体的媒体。Spring为我们提供了一个相应工厂类MapFactoryBean。具体的使用配置如下:

partner-bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="partnerBean" class="org.springframework.beans.factory.config.MapFactoryBean">
		<property name="targetMapClass">
			<value>java.util.HashMap</value>
		</property>
		<property name="sourceMap">
			<map>
				<entry key="base" value-ref="baseService"></entry>
				<entry key="baidu" value-ref="baiduService"></entry>
				<entry key="tencent" value-ref="tencentService"></entry>
				<entry key="taobao" value-ref="taobaoService"></entry>
			</map>
		</property>
	</bean>
	<bean id="baseService" class="com.mhy.service.BaseService"></bean>
	<bean id="baiduService" class="com.mhy.service.BaiduService"></bean>
	<bean id="tencentService" class="com.mhy.service.TencentService"></bean>
	<bean id="taobaoService" class="com.mhy.service.TaobaoService"></bean>
	
</beans>
配置完之后我们来测试一下

package com.mhy.service;

import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author mhy2011@gmail.com
 * @date 2014年12月8日 下午3:34:51
 */
public class PartnerServiceTest {

	@SuppressWarnings({ "resource", "unchecked" })
	public static void main(String[] args) {
		String[] partners = {"baidu", "tencent", "taobao", "qita"};
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("partner-bean.xml");
		Map<String, BaseService> map = (Map<String, BaseService>) ctx.getBean("partnerBean");
		
		for (String partner : partners) {
			BaseService service = map.get(partner);
			if(null == service){
				System.out.println("不存在的合作媒体.name=" + partner);
			}else{
				System.out.println("当前使用媒体.name=" + partner);
				service.order();	//执行下单操作
			}
		}
		
	}

}
然后我们来执行一下该文件,执行的结果如下:

从上面的执行结果可以看到,通过MapFactoryBean我们可以实现获取到指定实现类并执行相关的操作,大大降低了系统内的耦合性。如果后面需要增加一个媒体的话只需要增加一个该媒体的实现,然后从配置文件中配置一下即可。

好了,关于MapFactoryBean使用就说到这,如有问题欢迎大家指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MapFactoryBean应用详解 的相关文章

  • 【计算机视觉】Lecture 20:八点法

    提醒 本质 基础矩阵 本质矩阵和基础矩阵都是 3x3 的矩阵 xff0c 用于 编码 两个视图的对极几何 动机 xff1a 给定一张图像中的一个点 xff0c 乘以本质 基础矩阵将告诉我们在第二个视图中沿着哪个极线搜索 本质 基础矩阵总结
  • 【计算机视觉】Lecture 23:光流估计

    流估计 主要概念 xff1a 亮度08好恒定方程 孔径问题 Lucas Kanade算法 回顾 xff1a 由于自身运动产生的场 流 xff08 Flow xff09 xff1a 旋转分量不依赖于场景结构 平移分量随场景 Z 值的变化而变化
  • 【计算机视觉】Lecture 24:视频变化检测

    视频基础 每秒30帧 每一幅图像的处理时间不会太多 因此 xff0c 实时算法往往非常简单 视频图像的主要特征之一是帧间的时间一致性 在1 30秒内帧间变化不大 xff01 检测移动的对象 假设 xff1a 移动的对象是非常重要的 xff0
  • Eigen中基本和常用函数

    Eigen 中矩阵的定义 span class token macro property span class token directive keyword include span span class token string lt
  • 基于四元数的存在外点Wahba问题的可证明最优解

    论文地址 论文视频 文章导读 为什么这次要解读这篇文章 xff1f 因为上次文章 xff08 详见 TEASER 快速且可证明的点云配准算法和代码解读 xff09 旋转求解部分就是用本文中的方法 xff0c 所以本文算是TEASER方法的前
  • 极端外点率下鲁棒配准的多项式时间解

    论文地址 论文视频 文章导读 为什么要解读这篇文章 xff1f 因为之前接连介绍该作者的两个工作 xff0c TEASER 快速且可证明的点云配准算法和代码解读 和 基于四元数的存在外点Wahba问题的可证明最优解 xff0c 前者的未知有
  • 基于拉格朗日对偶的凸全局三维配准

    论文地址 文章导读 最近自己的工作有借鉴这篇文章中用到的拉格朗日对偶 xff0c 然后就细读了文章的内容并且分析了对应的代码 拉格朗日对偶属于凸优化的范畴 xff0c 详细的定义和理论可以在 Convex optimization 一书中进
  • PX4的软件在环仿真

    一 Linux ROS Nodes单机仿真 1 安装ROS Kinetic xff08 参考http wiki ros org kinetic Installation Ubuntu xff09 1 1 添加软件源 sudo sh c ec
  • 让STM32CubeMX带你飞,菜鸟秒变STM32高手

    让STM32CubeMX带你飞 xff0c 菜鸟秒变STM32高手 STM32CubeMX是ST意法半导体近几年来大力推荐的STM32芯片图形化配置工具 xff0c 允许用户使用图形化向导生成C 初始化代码 xff0c 可以大大减轻开发工作
  • Release file for http://xxx/ubuntu/dists/bionic-updates/InRelease is not valid yet报错解决

    参考 https blog 51cto com 5437315 2420097 中说明的原因 原因 xff1a 系统时间与网络时间 xff08 仓库 xff09 的不同导致更新错误 按照这个原因解释 xff0c 我查看了自己虚拟机内ubun
  • 如何在keil官网上下载 STM32包 pack

    https www 360kuai com pc 990a8ec633cf2109c cota 61 4 amp tj url 61 xz amp sign 61 360 57c3bbd1 amp refer scene 61 so 1
  • Makefile学习笔记系列1:一个简单的Makefile

    开启Makefile系列学习前 xff0c 先来个简单的 xff0c 没有子目录结构的例子 xff0c 只有一个makefile文件 目录结构 xff1a Makefile代码 xff1a XX 61 g 43 43 CFLAGS 61 g
  • PID控制算法的C语言实现

    PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题 xff0c 发现网络上尚没有一套完整的比较体系的讲解 于是总结了几天 xff0c 整理一套思路分享给大家 在工业应用中PID及其衍生算法是应用最广泛的
  • pageCache

    写在前面 在开始正式的讨论前 xff0c 我先抛出几个问题 xff1a 谈到磁盘时 xff0c 常说的HDD磁盘和SSD磁盘最大的区别是什么 xff1f 这些差异会影响我们的系统设计吗 xff1f 单线程写文件有点慢 xff0c 那多开几个
  • 基于Python高光谱遥感影像处理实例

    前言 在写波段配准相关代码时经常需要用到tif影像的波段合成和分解 xff0c 虽然可以用ENVI才处理 xff0c 但是每次都要打开再设置一些参数有些麻烦 xff0c 所以本着 独立自主 自力更生 的原则就写了些脚本来处理这个需求 又写了
  • 基于SIFT的图像Matlab拼接教程

    前言 图像拼接技术 xff0c 将普通图像或视频图像进行无缝拼接 xff0c 得到超宽视角甚至360度的全景图 xff0c 这样就可以用普通数码相机实现场面宏大的景物拍摄 利用计算机进行匹配 xff0c 将多幅具有重叠关系的图像拼合成为一幅
  • PERSIANN 降雨数据使用教程

    一 前言 PERSIANN xff0c 使用人工神经网络从遥感信息中估算降水 xff0c 是一种基于卫星的降水检索算法 xff0c 可提供近乎实时的降雨信息 该算法使用来自全球地球同步卫星的红外 IR 卫星数据作为降水信息的主要来源 红外图
  • 基于Pyqt5快速构建应用程序详细教程

    一 介绍 图形用户界面 xff0c 更广为人知的名称是 GUI xff0c 是当今大多数个人计算机的一个特征 它为不同计算技能水平的用户提供了直观的体验 尽管 GUI 应用程序可能会使用更多资源 xff0c 但由于其点击式特性 xff0c
  • 基于Python的PROSAIL模型介绍以及使用

    1 介绍 PROSAIL是两种模型耦合得到的 SAIL是冠层尺度的辐射传输模型 xff0c 把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层 xff0c 从而模拟入射辐射与均匀介质之间的相互作用 xff0c 具体还是挺复杂
  • 可能是最全的FreeRTOS源码分析及应用开发系列

    可能是最全的FreeRTOS源码分析及应用开发系列 FreeRTOS 是一个可裁剪的小型且免费的 RTOS 系统 xff0c 尺寸非常小 xff0c 可运行于微控制器上 其特点包括 xff1a 内核支持抢占式 xff0c 合作式和时间片调度

随机推荐

  • 关于VS中LNK1120与errorLNK2019问题

    最近遇到了该问题 xff0c 再查找了一些资料后 xff0c 发现了针对自己问题的解决方法 xff0c 贴出来让大家一起学习一下 其实如果这两个问题同时出现 xff0c 很可能不是链接库缺了lib xff0c 而是编译中添加的源没有被实例化
  • PCL—低层次视觉—点云分割(基于凹凸性)

    转自 xff1a http www cnblogs com ironstark p 5027269 html PCL 低层次视觉 点云分割 xff08 基于凹凸性 xff09 1 图像分割的两条思路 场景分割时机器视觉中的重要任务 xff0
  • 【ENVI入门系列】13.分类后处理

    原文地址 xff1a ENVI入门系列 13 分类后处理 作者 xff1a ENVI IDL中国 版权声明 xff1a 本教程涉及到的数据提供仅练习使用 xff0c 禁止用于商业用途 目录 分类后处理 1 概述 2 分类后处理 2 1 小斑
  • ENVI神经网络工具参数和使用方法

    原文地址 xff1a ENVI神经网络工具参数和使用方法 作者 xff1a pengheligis xff08 1 xff09 Activation xff1a 选择活化函数 对数 xff08 Logistic xff09 和双曲线 xff
  • 详解使用pscp命令Linux文件上传与下载

    一 上传 2 开始 运行 cmd进入到 dos模式输入以下命令 以下是代码片段 xff1a pscp D java apache tomcat 5 5 27 webapps szfdc rardev 64 192 168 68 249 ho
  • java学习总结及心得体会

    前言 xff1a 哈哈 xff0c 今天是2015年 xff18 月 xff12 号 xff0c 星期日 xff0c 今天是收货的一天 xff0c 很开心 xff0c 很快乐 到底发生了什么呢 xff0c 容我慢慢来 世界很大 xff0c
  • 二进制的表白

    没能提起勇气对她进行表白 xff0c 只能寄托于0 1代码记录下对你的喜欢 01000101 01110110 01100101 01101110 00100001 01001001 00100000 01101100 01101111 0
  • C语言strcat()函数:连接字符串

    头文件 xff1a include lt string h gt strcat 函数用来连接字符串 xff0c 其原型为 xff1a char strcat char dest const char src 参数 dest 为目的字符串指针
  • linux 下TCP通信例程

    TCP server span class token macro property span class token directive hash span span class token directive keyword inclu
  • FreeRTOS系列|消息队列一

    消息队列一 1 消息队列简介 消息队列可以在任务与任务 任务与中断之间传递消息 xff0c 队列可以保存有限个具有确定长度的数据单元 队列可保存的最大单元数目被称为队列的长度 xff0c 在队列创建时需要指定其长度和每个单元 xff08 队
  • 【达内课程】网络通信之HTTP协议和Get请求实例(1)

    文章目录 HTTP协议发送HTTP GET请求增加参数 HTTP协议 HTTP协议 HTTP 协议是超文本传输控制协议 HTTP 协议中定义了客户端与服务端的通信流程与数据交互格式 网络通信中的长连接与短链接 长连接 xff1a 当客户端与
  • 学习Kalibr工具--Camera与IMU联合标定过程

    上一节介绍了 xff0c 用kalibr工具对camera进行标定的操作流程 xff0c 在camera标定之好之后 xff0c 进行camera与IMU进行联合标定的操作的学习 xff0c 即求取相机和IMU 之间的转换关系 坐标系之间的
  • C++之数据对齐

    目录 关于对齐数据对齐结构体对齐原则原理分析 关于对齐 对齐方式 xff1a 表示的是一个类型的对象存放的内存地址应满足的条件好处 xff1a 对齐的数据在读写上有性能优势对于不对齐的结构体 xff0c 编译器会自动补齐以提高CPU的寻址效
  • 对于人工智能,你有怎样的认识和理解?

    作为最初级的程序员 xff0c 对于高深的技术总是望尘莫及 xff0c 而高大上的人工智能更是让我们感觉遥远 xff0c 不过路都是一步步走出来的 xff0c 只要一直走 xff0c 总有触及到的一天 今天就来聊聊你对于人工智能的认识吧 x
  • windows通过独立ip形式访问docker容器

    windows10环境下通过docker容器独立ip暴露给局域网进行访问 自定义docker network docker network create subnet 61 172 20 0 0 24 mhy net 启动docker ng
  • Docker镜像

    概述 前面我们说了Docker的基本概念 xff0c 这里我们把每一块内容进行详细疏理一下 xff0c 本篇主要讲的是Docker的镜像相关内容 注 xff1a 本篇内容主要以 Docker从入门到实践 中镜像一模块为主线 xff0c 结合
  • Docker容器

    概述 前面我们讲了Docker三个主要概念中的镜像 xff0c 这里我们再来讲一下Docker的第二个重要概念 xff1a 容器 容器是独立运行的一个或一组应用以及它们的运行态环境 关于容器本篇主要讲如下几部分内容 xff1a 启动容器 关
  • 如何进入Docker容器

    概述 在使用Docker创建了容器之后 xff0c 大家比较关心的就是如何进入该容器了 xff0c 其实进入Docker容器有好几多种方式 xff0c 这里我们就讲一下常用的几种进入Docker容器的方法 进入Docker容器比较常见的几种
  • 从零开始使用Docker构建Java Web开发运行环境

    概述 前面我们讲了关于Docker的一些基本概念和操作 xff0c 今天我们以一个简单的Java Web例子来说一下Docker在日常工作中的应用 xff0c 本篇主要讲如下几部分内容 xff1a 创建jdk镜像 创建resin镜像 启动w
  • Spring MapFactoryBean应用详解

    在我们工作中 xff0c 尤其是电商系统中 xff0c 一个庞大的电商平台不是一个封闭的平台 xff0c 往往还伴生着一个开放平台 xff0c 用以接入各个企业 xff0c 以实现一种共赢的局面 xff0c 一般来讲 xff0c 针对于这种