在看项目的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

转载于:https://www.cnblogs.com/keeya/p/9331058.html

Spring配置文件中的parent与abstract相关推荐

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

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

  2. spring配置文件中分别使用多个properties文件

    spring配置文件中分别使用多个properties文件 在使用spring时,有时候需要为了模块配置方便有时候需要针对不同的模块建立不同的applicationContext的配置文件,然后在对应 ...

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

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

  4. spring配置文件中引入其他的配置文件

    spring配置文件中,如何引入其他的配置文件,如下: <import resource="abc/abc.xml">

  5. Spring配置文件中引入properties文件

    jdbc.properties文件中有信息如下: username=root url=jdbc:mysql://localhost:3306/qw?characterEncoding=utf8 dri ...

  6. Spring配置文件中注入复杂类型属性

    Spring在整合其他框架时在配置文件中可能会涉及到复杂类型属性的注入,以下举例说明: 1.数组类型 2.List集合类型 3.Set集合类型 4.Map集合类型 5.Properties属性类型 直 ...

  7. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)

    2019独角兽企业重金招聘Python工程师标准>>> spring使用了这么长时间, 你真的了解spring bean加载的机制吗? 这个是我们项目中最常见的配置文件中的内容配置, ...

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

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

  9. CXF客户端配置请求超时限制-SocketTimeoutException(Spring配置文件中配置和通过代码进行配置)

    在用cxf  开发webservice应用时,客户端老报 java.net.SocketTimeoutException: Read timed out 原因为连接超时,google 参考链接 Spr ...

  10. Spring PropertyPlaceholderConfigurer Usage - 使用系统变量替换spring配置文件中的变量

    spring 中可以在import 的filename中使用变量 <import resource="camel-context-routes.${username}xml" ...

最新文章

  1. Error:This Gradle plugin requires Studio 3.0 minimum
  2. Spark 源码分析
  3. 最近,又一家互联网公司裁员了,失业来得太突然…
  4. Python程序设计题解【蓝桥杯官网题库】 DAY9-基础练习
  5. UML建模——用例图(Use Case Diagram)
  6. 【转】[C++]LARGE_INTEGER 类型使用
  7. PHP面试之二:高并发与大数据
  8. mysql中如何计算党龄_党员的党龄如何计算?
  9. python: insert()函数用法
  10. CentOS系统找回MySQL数据库root登录密码
  11. 「leetcode」763.划分字母区间【贪心算法】详细图解
  12. 用R解析Mahout用户推荐协同过滤算法(UserCF)
  13. android通用对话框,android-所有活动中的“通用”对话框
  14. 修改JDK的经历:两处字体的粗体代码引起的错误
  15. 软件安全测试是为了什么,一航软件测评有这些见解
  16. 《老路用得上的商学课》21-25学习笔记
  17. unity 裙子摆动_【Unity Shader】摇摆的小草——顶点动画
  18. 今年-计划写一本java方面的书籍
  19. html中的author属性,meta标签name=“auther”属性写法和用法详解
  20. Android 代码中动态设置字体大小-TextView.SetTextSize()

热门文章

  1. 【机器学习7】决策树
  2. 2019ICPC徐州 H.Yuuki and a problem(树状数组套权值线段树)
  3. ios隐私政策_新的iOS 14已经揭露了严重的隐私问题
  4. PostgreSQL逻辑订阅
  5. strongswan与sangfor的ikev2配置
  6. Android中ListView下拉刷新的实现
  7. 深拖式多道高分辨率地震探测系统
  8. java 拼图_拼图延迟的历史-Oracle正式将Java 9的发布日期推迟到2017年
  9. uva 11584 dp
  10. MySQL究竟是如何做到持久性的?