14 PropertyOverrideConfigurer
14.1 简介
打个比方我们在bean容器中定义了一个beanA,其中有一个属性propB,对应值为valueB,但是我又希望在不更改bean定义的情况下希望Spring在实例化beanA时将对应的属性propB的值改为valueC,那么这个时候我们就可以使用PropertyOverrideConfigurer来实现这个效果了。PropertyOverrideConfigurer实现了BeanFactoryPostProcessor接口,其将在Spring加载完对应容器中所有的bean定义之后根据定义的属性来覆盖bean定义中既有属性的值。
来看一个示例,假设我们有如下定义的一个类Hello,其拥有一个int型的属性maxVal。
public class Hello {
private int maxVal;
public int getMaxVal() {
return maxVal;
}
public void setMaxVal(int maxVal) {
this.maxVal = maxVal;
}
}
在我们的bean定义中定义了一个Hello类型的bean,并指定了其属性maxVal的值为1。
<bean id="hello" class="com.app.Hello" p:maxVal="1"/>
那么这个时候我们在当前bean容器中定义一个PropertyOverrideConfigurer类型的bean,形式如下。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="location" value="classpath:overrideConfig.properties"/>
</bean>
我们可以看到,其通过setLocation()方法注入了一个Resource,对应类路径下的overrideConfig.properties。接着来看一下该文件的内容。
hello.maxVal=10
该文件就简单的定义了一行,即一个属性。PropertyOverrideConfigurer在拿到了该属性后将在容器中所有的bean定义加载完成后,在容器中寻找id或name为hello的bean,然后将其属性maxVal的值置为10。对应的值将在实例化该bean时通过setMaxVal()方法进行赋值。这就是PropertyOverrideConfigurer干的事。其所使用的属性文件中属性名的定义形式是“beanName.prop1[.prop2[…]]”
,即属性名称至少由两部分组成,第一部分是目标bean的名称,第二部分是目标bean的属性,或属性的属性,它们之间以点进行连接。如“beanA.prop1.prop2=5”
即表示设置beanA的prop1的prop2为5,对应语义为beanA.getProp1().setProp2(5
)。
PropertyOverrideConfigurer只能用来替换文本类型的属性,像需要覆盖一个bean所关联的另一个bean这种需求就是不行,如果真有这种需求则推荐将其定义为一个属性变量,然后通过PropertyPlaceholderConfigurer进行替换。
14.2 加载属性的方式
PropertyOverrideConfigurer能够用来作为属性值覆盖的属性定义可以有多种形式,可以使用外部定义的属性文件,也可以使用PropertyOverrideConfigurer内部持有的属性定义。
14.2.1 外部文件
我们可以通过PropertyOverrideConfigurer的setLocation()方法和setLocations()方法来指定当前PropertyOverrideConfigurer需要使用的外部属性文件定义。其中setLocation()方法将用来指定单个文件,而setLocations()方法则可以用来指定一到多个文件。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 通过setLocations()方法指定需要使用的外部属性文件定义 -->
<property name="locations">
<array>
<value>classpath:overrideConfig.properties</value>
<value>classpath:overrideConfig2.properties</value>
</array>
</property>
</bean>
14.2.2 内部定义
通过PropertyOverrideConfigurer的setProperties()和setPropertiesArray()方法我们可以定义其使用的内部属性定义。其中setProperties()方法接收单个Properties对象,而setPropertiesArray()方法接收一到多个Properties对象。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 定义内部localProperties定义 -->
<property name="propertiesArray">
<array>
<ref bean="overrideConfig1"/>
</array>
</property>
</bean>
<!-- 定义Properties类型的bean -->
<bean id="overrideConfig1" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="hello.maxVal">10</prop>
</props>
</constructor-arg>
</bean>
14.2.3 优先级
当一个PropertyOverrideConfigurer既指定了外部属性文件定义,又指定了内部属性定义时,如果某一个属性在外部属性文件和内部属性定义中同时存在,默认情况下外部属性文件定义的属性将覆盖内部属性定义。即如果外部属性文件定义指定了beanA.propB=1,而内部属性定义指定了beanA.propB=2,则最终使用的属性定义将是外部属性文件定义的beanA.propB=1。如果希望最终使用的是内部属性定义,即beanA.propB=2,则我们可以通过PropertyOverrideConfigurer的setLocalOverride()方法指定localOverride的值为true,即存在相同属性定义时内部属性定义将覆盖外部属性文件的定义。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 通过setLocation()方法指定需要使用的外部属性文件定义 -->
<property name="location" value="classpath:overrideConfig.properties"/>
<!-- 定义内部properties定义 -->
<property name="properties">
<props>
<prop key="hello.maxVal">50</prop>
</props>
</property>
<!-- 指定内部属性定义将覆盖外部属性文件定义的相同属性 -->
<property name="localOverride" value="true"/>
</bean>
14.3 指定beanName与属性之间的分隔符
beanName与属性之间的分隔符默认是点“.”。用户可以通过PropertyOverrideConfigurer的setBeanNameSeparator()方法来指定新的分隔符。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 定义内部properties定义 -->
<property name="properties">
<props>
<prop key="hello$maxVal">50</prop>
<prop key="hello$world.id">100</prop>
</props>
</property>
<!-- 指定beanName与属性之间的分隔符为$ -->
<property name="beanNameSeparator" value="$"/>
</bean>
如上所示,我们指定了beanName和属性之间的分隔符为“$”,所以当我们需要覆盖beanName为hello的maxVal的值时应该定义hello$maxVal=50
。但是属性的属性之间还是以点进行分隔,如上述示例中的hello$world.id=100
。
14.4 忽略文件未找到
默认情况下我们定义的外部属性文件不存在时将会抛出异常信息,如果用户不希望抛出异常信息,则可以通过setIgnoreResourceNotFound(true)
方法设置忽略文件未找到的情况。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 忽略外部属性文件不存在的异常信息 -->
<property name="ignoreResourceNotFound" value="true"/>
<!-- 该文件不存在,但是由于ignoreResourceNotFound设置为true将不会抛出异常 -->
<property name="location" value="afsf"/>
</bean>
14.5 忽略不存在的属性
默认情况下PropertyOverrideConfigurer使用的所有外部属性文件或内部属性定义的属性都将用来寻找对应的bean和属性进行属性值的覆盖。当存在非beanName.property
形式的属性定义或定义的bean或属性不存在时将抛出异常。如果用户不希望此种情况抛出异常,则可以通过setIgnoreInvalidKeys()
方法设置ignoreInvalidKeys属性值为true,已达到忽略不存在的属性的效果。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 忽略无效的属性定义,包括不存在的bean或属性等 -->
<property name="ignoreInvalidKeys" value="false"/>
<property name="properties">
<props>
<prop key="abc">1</prop>
<prop key="abc.adcdf">2</prop>
</props>
</property>
</bean>
14.6 指定加载顺序
我们可以在一个bean容器中同时定义多个PropertyOverrideConfigurer,这时候可以通过其setOrder()
方法指定当前PropertyOverrideConfigurer的处理顺序,对应值越小的越先处理。当多个PropertyOverrideConfigurer需要覆盖同一个bean的同一个属性时将取最后进行覆盖的那个PropertyOverrideConfigurer覆盖的值。
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 指定处理顺序 -->
<property name="order" value="1"/>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<!-- 指定处理顺序 -->
<property name="order" value="2"/>
</bean>
14.7 使用命名空间进行定义
PropertyOverrideConfigurer也支持在Spring的配置文件中通过引入对应的命名空间后使用对应的标签进行定义。如果需要使用命名空间定义,我们首先需要在Spring配置文件中引入context对应的命名空间,然后在其中定义一个property-override标签,这样Spring将自动创建一个PropertyOverrideConfigurer类型的bean定义。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-override/>
</beans>
然后我们可以通过property-override标签的属性来指定对应的参数。主要的可选参数如下。
- location:用于指定需要使用的外部资源文件的路径。多个文件路径之间使用逗号进行分隔。
- properties-ref:用于指定需要使用的内部属性定义对应的bean的名称。
- ignore-unresolvable:用于指定是否忽略不能解析的属性,默认为false。
- ignore-resource-not-found:用于指定是否忽略location指定路径的文件不存在的情况,默认为false。
- order:用于在定义当前PropertyOverrideConfigurer的处理顺序。
(注:本文是基于Spring4.1.0所写)
相关推荐
三、Spring框架的核心概念——依赖注入与控制反转 依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(Inversion of Control, IoC),即控制权从应用代码转移到外部容器。在Spring中,依赖注入...
基于 OpenCV 的魔兽世界钓鱼机器人
供应链管理中信息共享问题的研究
青春文学中的爱情观呈现
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
XLSReadWriteII6.02.01.7z
图解系统-小林coding-v1.0
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
漫画作品与乌托邦理想追求
江苏建筑消防设施维护保养规程.rar
内容概要:论文介绍了一款名为DODRIO的交互式可视化工具,帮助自然语言处理(NLP)研究人员和从业者解析基于转换器架构的语言模型内部工作机理。DODRIO整合了概述图与详尽视图,支持用户比较注意力权重与其输入文本的句法结构和语义特征。具体而言,它包含了依赖关系视图(Dependency View)、语义关注图(Semantic Attention Graph)以及注意力头概览(Attention Head Overview),并利用不同的图形展示方法使复杂的多层多头转换器模型中的注意力模式更容易理解和研究。 适用人群:适用于从事深度学习、自然语言处理的研究人员和技术从业者;尤其适合对基于变换器架构的大规模预训练语言模型感兴趣的开发者们。 使用场景及目标:DODRIO用于探索转换器模型各层级之间的联系、验证已有研究成果,同时激发新假设形成。具体使用时可以选择特定数据集中的句子作为样本输入,观察不同注意力机制如何响应文本内容的变化。此外,还可以用来对比精简版本DistilBERT的表现,评估其相对全量模型BERT的优势与不足。 其他说明:DODRIO为开源项目,提供web端实施方式,使得
该代码使用scikit-learn的乳腺癌数据集,完成分类模型训练与评估全流程。主要功能包括:数据标准化、三类模型(逻辑回归、随机森林、SVM)的训练、模型性能评估(分类报告、混淆矩阵、ROC曲线)、随机森林特征重要性分析及学习曲线可视化。通过`train_test_split`划分数据集,`StandardScaler`标准化特征,循环遍历模型进行统一训练和评估。关键实现细节包含:利用`classification_report`输出精确度/召回率等指标,绘制混淆矩阵和ROC曲线量化模型效果,随机森林的特征重要性通过柱状图展示,学习曲线分析模型随训练样本变化的拟合趋势。最终将原始数据和预测结果保存为CSV文件,便于后续分析,并通过matplotlib进行多维度可视化比较。代码结构清晰,实现了数据处理、模型训练、评估与可视化的整合,适用于乳腺癌分类任务的多模型对比分析。
在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。
内容概要:本文档介绍了基于MATLAB实现的贝叶斯优化(BO)、Transformer和GRU相结合的多特征分类预测项目实例,涵盖了详细的程序设计思路和具体代码实现。项目旨在应对数据的多样性与复杂性,提供一种更高效的多特征数据分类解决方案。文档主要内容包括:项目背景与意义,技术难点与解决方案,具体的实施流程如数据处理、模型构建与优化、超参数调优、性能评估以及精美的GUI设计;详细说明了Transformer和GRU在多特征数据分类中的应用及其与贝叶斯优化的有效结合,强调了其理论与实际应用中的价值。 适合人群:具备一定机器学习和MATLAB编程基础的研发人员,特别是从事多维数据处理与预测工作的专业人士和技术爱好者。 使用场景及目标:① 适用于金融、医疗、交通等行业,进行复杂的多维数据处理和预测任务;② 提升现有分类任务中复杂数据处理的准确度和效率,为各行业提供智能预测工具,如金融市场预测、患者病情发展跟踪、交通流量管理等。 其他说明:本文档包含了丰富的实战案例和技术细节,不仅限于模型设计本身,还涉及到数据清洗、模型优化等方面的知识,帮助使用者深入理解每一步骤背后的原理与实现方法。通过完整的代码样例和GUI界面设计指导,读者可以从头到尾跟随文档搭建起一套成熟的分类预测系统。
大数据的sql练习题,初级中级高级
内容概要:论文介绍了名为Transformer的新网络架构,它完全基于自注意力机制,在不使用递归或卷积神经网络的情况下建模输入与输出之间的全局依赖关系,尤其适用于长文本处理。通过多头自注意力层和平行化的全连接前馈网络,使得在机器翻译任务上的表现优于当时最佳模型。具体地,作者用此方法实现了对英语-德语和英语-法语翻译、句法解析等任务的高度并行化计算,并取得显著效果。在实验方面,Transformer在较短训练时间内获得了高质量的翻译结果以及新的单一模型基准。除此之外,研究人员还探索了模型变体的效果及其对于不同参数变化时性能的变化。 适用人群:从事自然语言处理领域的研究者、工程师、学生,熟悉深度学习概念尤其是编码器-解码器模型以及关注模型创新的人士。 使用场景及目标:主要适用于序列到序列(seq2seq)转换任务如机器翻译、语法分析、阅读理解和总结等任务的研究和技术开发;目标在于提高计算效率、缩短训练时间的同时确保模型性能达到或超过现有技术。 其他说明:本文不仅提出了一个新的模型思路,更重要的是展示了自注意力机制相较于传统LSTM或其他方式所拥有的优势,例如更好地捕捉远距离上下文关系的能力
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。