Spring MapFactoryBean应用详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MapFactoryBean应用详解相关的知识,希望对你有一定的参考价值。

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

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

技术分享


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

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

BaseService.java

  1. package com.mhy.service;  
  2.   
  3. /** 
  4.  * @author [email protected] 
  5.  * @date 2014年12月8日 下午3:10:12 
  6.  */  
  7. public class BaseService {  
  8.   
  9.     public void order(){  
  10.         System.out.println("BaseService.order执行");  
  11.     }  
  12. }  

内容很简单,只有一句输出,此处只是演示,真实的合作中自然不会是这么简单的。

BaiduService.java

  1. package com.mhy.service;  
  2.   
  3. /** 
  4.  * @author [email protected] 
  5.  * @date 2014年12月8日 下午3:12:07 
  6.  */  
  7. public class BaiduService extends BaseService {  
  8.   
  9.     @Override  
  10.     public void order() {  
  11.         System.out.println("BaiduService.order执行");  
  12.     }  
  13. }  

TencentService.java

  1. package com.mhy.service;  
  2.   
  3. /** 
  4.  *  
  5.  * @author [email protected] 
  6.  * @date 2014年12月8日 下午3:13:06 
  7.  */  
  8. public class TencentService extends BaseService {  
  9.   
  10. }  

TaobaoService.java

  1. package com.mhy.service;  
  2.   
  3. /** 
  4.  * @author [email protected] 
  5.  * @date 2014年12月8日 下午3:12:22 
  6.  */  
  7. public class TaobaoService extends BaseService {  
  8.   
  9. }  

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

partner-bean.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.            http://www.springframework.org/schema/beans/spring-beans.xsd">  
  6.   
  7.     <bean id="partnerBean" class="org.springframework.beans.factory.config.MapFactoryBean">  
  8.         <property name="targetMapClass">  
  9.             <value>java.util.HashMap</value>  
  10.         </property>  
  11.         <property name="sourceMap">  
  12.             <map>  
  13.                 <entry key="base" value-ref="baseService"></entry>  
  14.                 <entry key="baidu" value-ref="baiduService"></entry>  
  15.                 <entry key="tencent" value-ref="tencentService"></entry>  
  16.                 <entry key="taobao" value-ref="taobaoService"></entry>  
  17.             </map>  
  18.         </property>  
  19.     </bean>  
  20.     <bean id="baseService" class="com.mhy.service.BaseService"></bean>  
  21.     <bean id="baiduService" class="com.mhy.service.BaiduService"></bean>  
  22.     <bean id="tencentService" class="com.mhy.service.TencentService"></bean>  
  23.     <bean id="taobaoService" class="com.mhy.service.TaobaoService"></bean>  
  24.       
  25. </beans>  

配置完之后我们来测试一下

  1. package com.mhy.service;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. /** 
  9.  * @author [email protected] 
  10.  * @date 2014年12月8日 下午3:34:51 
  11.  */  
  12. public class PartnerServiceTest {  
  13.   
  14.     @SuppressWarnings({ "resource", "unchecked" })  
  15.     public static void main(String[] args) {  
  16.         String[] partners = {"baidu", "tencent", "taobao", "qita"};  
  17.           
  18.         ApplicationContext ctx = new ClassPathXmlApplicationContext("partner-bean.xml");  
  19.         Map<String, BaseService> map = (Map<String, BaseService>) ctx.getBean("partnerBean");  
  20.           
  21.         for (String partner : partners) {  
  22.             BaseService service = map.get(partner);  
  23.             if(null == service){  
  24.                 System.out.println("不存在的合作媒体.name=" + partner);  
  25.             }else{  
  26.                 System.out.println("当前使用媒体.name=" + partner);  
  27.                 service.order();    //执行下单操作  
  28.             }  
  29.         }  
  30.           
  31.     }  
  32.   
  33. }  

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

技术分享

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



以上是关于Spring MapFactoryBean应用详解的主要内容,如果未能解决你的问题,请参考以下文章

Spring MapFactoryBean例子

Spring4-MapFactoryBean的使用

Spring基础知识详解

Spring的概念详解

Spring常见问题详解

Spring Security应用详解(集成SpringBoot)