在看项目的Spring配置文件时,发现消息队列的配置采用了继承方式配置Bean,在这梳理总结一下。

其实在基于spring框架开发的项目中,如果有多个bean都是一个类的实例,如配置多个数据源时,大部分配置的属性都一样,只有少部分不一样。这样的话在配置文件中可以配置和对象一样进行继承。

例如

<bean id="testParent"  abstract="true"  class="com.bean.TestBean">
<property name="param1" value="父参数1"/>
<property name="param2" value="父参数2"/>
</bean>
<bean id="testBeanChild1" parent="testParent"/>
<bean id="testBeanChild2" parent="testParent">
<property name="param1" value="子参数1"/>
</bean>
  • 其中 abstract="true" 的配置表示:此类在Spring容器中不会生成实例。
  • parent="testBeanParent" 代表子类继承了testBeanParent,会生成具体实例,在子类Bean中配置会覆盖父类对应的属性。

在博主项目中遇到场景是这样的:

在Spring配置文件中配置消息队列中消费者的实现类,但其实每个消费者仅仅有个几个属性不相同,为了避免代码冗余、修改和可扩展,采用了上述的方式进行配置。

配置如下:

order-task-comsumer.xml

父类中将消息队列所以要的各种key和url配置全,子类仅仅只有几个属性不同。

如果以后非淘平台的业务膨胀了,仅仅只要在配置文件中拆出部分,很方便。

<!-- 自动下单任务监听 -->
<bean id="abstractAutoFetchOrderTaskMessageListener" abstract="true" class="com.foonsu.erp.orderpool.listeners.AutoFetchOrderTaskMessageListener">
<property name="accessKey" value="${taobao.appKey}" />
<property name="secretKey" value="${taobao.appSecret}" />
<property name="onsChannel" value="${mq.erp_orderpool.autoFetchOrder.onsChannel}" />
<property name="messageModel" value="${mq.erp_orderpool.autoFetchOrder.messageModel}" />
<property name="topic" value="${mq.erp_orderpool.autoFetchOrder.topic}" />
<property name="messageOrder" value="${mq.erp_orderpool.autoFetchOrder.messageOrder}" />
<property name="orderPoolTaskHandlers" ref="orderPoolTaskHandlersMap"/>
</bean>
<!--消费淘宝平台消息的消费者 -->
<bean id="taobaoAutoFetchOrderTaskMessageListener" parent="abstractAutoFetchOrderTaskMessageListener" >
<property name="consumerId" value="${mq.erp_orderpool.autoFetchOrder.taobaoConsumerId}" />
<property name="subExpression" value="${mq.erp_orderpool.autoFetchOrder.taobaoSubExpression}" />
<property name="consumeThreadNums" value="${mq.erp_orderpool.autoFetchOrder.taobaoConsumeThreadNums}" />
</bean>
<!--消费非淘宝平台消息的消费者 -->
<bean id="otherAutoFetchOrderTaskMessageListener" parent="abstractAutoFetchOrderTaskMessageListener" >
<property name="consumerId" value="${mq.erp_orderpool.autoFetchOrder.otherConsumerId}" />
<property name="subExpression" value="${mq.erp_orderpool.autoFetchOrder.otherSubExpression}" />
<property name="consumeThreadNums" value="${mq.erp_orderpool.autoFetchOrder.otherConsumeThreadNums}" />
</bean> <bean id="orderPoolTaskHandlersMap" class="java.util.HashMap">
<constructor-arg>
<map>
<entry key="01" value-ref="taoBaoOrderTaskHandler" />
<entry key="05" value-ref="jdOrderTaskHandler" />
<entry key="25" value-ref="dadangjiaOrderTaskHandler" />
<entry key="16" value-ref="pddOrderTaskHandler" />
<entry key="13" value-ref="alibabaOrderTaskHandler" />
</map>
</constructor-arg>
</bean>

ps:${XXX} 配置中类似这样的符号表示是从properties文件中读取需要的配置,Spring加载的时候会替换。

alibaba.properties

alibaba.appKey=7151192
alibaba.appSecret=vLCR5tk0D5u7
alibaba.dataUrl=http://gw.open.1688.com/openapi/
alibaba.accessTokenUrl=https://gw.open.1688.com/openapi/http/1/system.oauth2/getToken/7151192
alibaba.refreshTokenUrl=https://gw.open.1688.com/openapi/param2/1/system.oauth2/getToken/7151192
alibaba.logisticsCompanyCodeMapStr=01\=SF,\u987a\u4e30|02\=EMS,EMS|03\=STO,\u7533\u901a|04\=HTKY,\u767e\u4e16\u5feb\u9012|05\=YTO,\u5706\u901a|06\=ZTO,\u4e2d\u901a|07\=YUNDA,\u97f5\u8fbe|08\=EYB,EMS\u7ecf\u6d4e\u5feb\u9012|09\=ZJS,\u5b85\u6025\u9001|10\=OTHER,\u5176\u5b83|11\=UC,\u4f18\u901f|12\=TTKDEX,\u5929\u5929|13\=QFKD,\u5168\u5cf0\u5feb\u9012|14\=FAST,\u5feb\u6377\u901f\u9012|15\=POSTB,\u90ae\u653f\u56fd\u5185\u5c0f\u5305|16\=GTO,\u56fd\u901a\u5feb\u9012|17\=DBKD,\u5fb7\u90a6\u5feb\u9012|18\=EMS,EMS|19\=OTHER,\u5176\u5b83|20\=OTHER,\u5176\u5b83|21\=ANE56,\u5b89\u80fd\u7269\u6d41|22\=OTHER,\u5176\u5b83|23\=OTHER,\u5176\u5b83|24\=SURE,\u901f\u5c14|25\=OTHER,\u5176\u5b83

Spring配置文件中的parent与abstract的更多相关文章

  1. Spring配置文件中使用ref local与ref bean的区别

    Spring配置文件中使用ref local与ref bean的区别.在ApplicationResources.properties文件中,使用<ref bean>与<ref lo ...

  2. 通过Spring配置文件中bean中的property赋值

    基本数据类型赋值-通过spring配置文件中bean中的property 扩展-以此方式可以通过配置为连接数据的属性赋值 1.如果是基本数据类型,可以通过setter方法为对象中的属性设置初始值,应用 ...

  3. Spring配置文件中未引入dubbo命名空间头部配置而引起的错误案例

    问题描述: Spring配置文件中未引入dubbo命名空间的头部配置而引起项目启动时报出如下错误信息: org.springframework.beans.factory.xml.XmlBeanDef ...

  4. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  5. 在spring配置文件中引入外部properties配置文件 context:property-placeholder

    在spring的配置文件中,有时我们需要注入很多属性值,这些属性全都写在spring的配置文件中的话,后期管理起来会非常麻烦.所以我们可以把某一类的属性抽取到一个外部配置文件中,使用时通用spring ...

  6. Spring 源码(4)在Spring配置文件中自定义标签如何实现?

    Spring 配置文件自定义标签的前置条件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的创建过 ...

  7. [Spring] Spring配置文件中特殊字符的规定

    今天查找一个错误,发现在xml里面不能包含特殊字符:&,特来总结一下: XML中共有5个特殊的字符,分别是:&<>“’.如果配置文件中的注入值包括这些特殊字符,就需要进行特 ...

  8. XML配置文件的命名空间与Spring配置文件中的头

    一直以来,写Spring配置文件,都是把其他配置文件的头拷贝过来,最多改改版本号,也不清楚哪些是需要的,到底是干嘛的.今天整理一下,拒绝再无脑copy. 一.Spring配置文件常见的配置头 < ...

  9. Spring配置文件中如何使用外部配置文件配置数据库连接

    直接在spring的配置文件中applicationContext.xml文件中配置数据库连接也可以,但是有个问题,需要在url后带着使用编码集和指定编码集,出现了如下问题,&这个符号报错-- ...

随机推荐

  1. Flex4 outerDocument

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  2. Tomcat源码分析——请求原理分析(中)

    前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...

  3. js格式化文件大小,单位:Bytes、KB、MB、GB

    原文出自:https://blog.csdn.net/seesun2012 // 格式化文件大小 function renderSize(value){ if(null==value||value== ...

  4. ashx+jsonp+document.referrer

    -- 一年前学的JSONP 跨域,一年后的今天相关知识点基本忘光.花了一天时间重新学习,再次感谢各位前辈的帖子,特此记录如下. --html <!DOCTYPE html PUBLIC &quo ...

  5. jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)

    如果你看了上一篇<ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)>的话,应该就知道我是逼不得已要认真学 ...

  6. WPF中ScrollViewer嵌套引发滚动失灵的Bug

    事情起因 测试报告说存在滚动条不能拖动的情况,我们几个开发人员多次测试都未重现该问题.后面发现是操作系统的问题,在XP和部分Win7上会存在该问题.而在我们开发人员的机器上,包括Win7 SP1,Wi ...

  7. PHP高级工程师面试 - 笔试题

    Part1:HTTP协议 1.状态码的含义 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求 ...

  8. K:栈相关的算法

    本博文总结了常见的应用栈来进行实现的相关算法 ps:点击相关问题的标题,即可进入相关的博文进行查看其算法的思想及其实现,这篇博文更多的是作为目录使用 大数加法:在java中,整数是有最大上限的.所谓大 ...

  9. java设计模式-----9、观察者模式

    Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态. Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对 ...

  10. meta name id class 标签的区别

    meta https://zhidao.baidu.com/question/2052283721385566387.html name 跟 id 的区别 http://blog.csdn.net/f ...