Spring中bean的parent、depends-on、factory-bean、factory-method属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中bean的parent、depends-on、factory-bean、factory-method属性相关的知识,希望对你有一定的参考价值。
参考技术A 配置了parent属性的bean可以继承指定的bean的属性。例子:
Singer.java
context.xml,定义的Jane和Bibi都指定ChineseFemaleSinger为parent,她们将继承ChineseFemaleSinger的country和gender属性。
App.java
执行App的main方法,输出:
配置了depends-on的bean会在被指定的bean初始化之后初始化,销毁前销毁。
例子:
BeanA.java
BeanB.java
context.xml
beanA和beanB都配置了init-method和destroy-method,在初始化和销毁时输出一些信息,以便判断初始化和销毁的顺序。
App.java
执行main方法,输出
可以看到,beanB在beanA初始化后初始化,在beanA销毁前销毁。
factory-bean属性指定一个bean,factory-method指定某个返回一个对象的方法。
例子:
Phone.java
IphoneFactory.java
context.xml
App.java
执行main方法,输出
Spring配置文件中的parent与abstract
在看项目的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,u987au4e30|02=EMS,EMS|03=STO,u7533u901a|04=HTKY,u767eu4e16u5febu9012|05=YTO,u5706u901a|06=ZTO,u4e2du901a|07=YUNDA,u97f5u8fbe|08=EYB,EMSu7ecfu6d4eu5febu9012|09=ZJS,u5b85u6025u9001|10=OTHER,u5176u5b83|11=UC,u4f18u901f|12=TTKDEX,u5929u5929|13=QFKD,u5168u5cf0u5febu9012|14=FAST,u5febu6377u901fu9012|15=POSTB,u90aeu653fu56fdu5185u5c0fu5305|16=GTO,u56fdu901au5febu9012|17=DBKD,u5fb7u90a6u5febu9012|18=EMS,EMS|19=OTHER,u5176u5b83|20=OTHER,u5176u5b83|21=ANE56,u5b89u80fdu7269u6d41|22=OTHER,u5176u5b83|23=OTHER,u5176u5b83|24=SURE,u901fu5c14|25=OTHER,u5176u5b83
以上是关于Spring中bean的parent、depends-on、factory-bean、factory-method属性的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot-starter-parent和spring-boot-dependencies
SpringBoot系列——Springboot项目中的spring-boot-starter-parent,spring-boot-dependencies依赖关系