Spring中PropertyPlaceholderConfigurer这个类,它是用来解析Java Properties属性文件值,并提供在spring配置期间替换使用属性值。接下来让我们逐渐的深入其配置。
基本的使用方法是:
<bean id="propertyConfigurerForAnalysis"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/spring/include/dbQuery.properties</value>
</property>
</bean>
其中classpath是引用src目录下的文件写法。
也可以这么写:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/config/jdbc/jdbc.properties</value>
</list>
</property>
</bean>
2.多个Properties文件的配置
当存在多个Properties文件时,配置就需使用locations了:(2)
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/spring/include/jdbc-parms.properties</value>
<value>classpath:/spring/include/base-config.properties</value>
</list>
</property>
</bean>
3.多个PropertyPlaceholderConfigurer来分散配置
接下来我们要使用多个PropertyPlaceholderConfigurer来分散配置,达到整合多工程下的多个分散的Properties文件,其配置如下:(3)
<bean id="propertyConfigurerForProject1"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:/spring/include/dbQuery.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurerForProject2"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="2" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:/spring/include/jdbc-parms.properties</value>
<value>classpath:/spring/include/base-config.properties</value>
</list>
</property>
</bean>
其中order属性代表其加载的顺序,如果没有设置就按照加载xml文件时的顺序,而ignoreUnresolvablePlaceholders为是否忽略不可解析的Placeholder,如果配置了多个PropertyPlaceholderConfigurer,则该属性必须设置且为true,否则propertyConfigurerForProject2的properties文件不会被加载.
至此你已经了解到了如何使用PropertyPlaceholderConfigurer,如何使用多个Properties文件,以及如何配置多个PropertyPlaceholderConfigurer来分解工程中分散的Properties文件。
注意事项:
(1)如果上面的dbQuery.properties与jdbc-parms.properties文件中有相同的参数配置名称,dbQuery.properties中配置的参数值不会被后面的覆盖;
(2)如果jdbc-parms.properties,base-config.properties彼此有相同参数名配置,jdbc-parms.properties中的配置的值会被覆盖;
4.自定义扩展PropertyPlaceholderConfigurer实现
例如:配置文件的路径,需要动态确定的,就需要自己扩展PropertyPlaceholderConfigurer的实现,自己获取文件路径,load properties文件,然后将load后的properties加入PropertyPlaceholderConfigurer
package com.common.spring.ext;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import com.common.exception.ApplicationException;
import com.common.util.GlobalProperties;
import com.common.util.PropertiesUtil;
public class GollfPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
public void setGollfPropFiles(Set<String> gollfPropFiles) {
String propPath = GlobalProperties.getProperty(GlobalProperties.PROPERTIES_FOLDER_PATH); //通过其他配置获取路径
String fileSeparator = System.getProperty("file.separator");
Properties properties = new Properties();
for (String gollfPropFile : gollfPropFiles) {
String nodeName = System.getProperty("weblogic.Name");
gollfPropFile = gollfPropFile.replaceAll("\\[NODE_NAME\\]", nodeName); //NODE_NAME 是根据不同weblogic server确定
String file = propPath + fileSeparator + gollfPropFile;
try {
logger.info("Loading properites file from " + file);
Properties prop = PropertiesUtil.loadProperties(file); //返回properties文件
logger.debug("Properties -> " + prop);
if(prop != null) {
properties.putAll(prop);
}
} catch (Exception e) {
logger.fatal(new ApplicationException("Properties file " + gollfPropFile +
" cannot be found. All related functionalities may be unavailable", e, true));
}
}
this.setProperties(properties); //关键方法,调用的PropertyPlaceholderConfigurer中的方法,
//通过这个方法将自定义加载的properties文件加入spring中
}
}
xml配置
<bean id="auditJmsProperties"
class="com.common.spring.ext.GollfPropertyPlaceholderConfigurer">
<property name="gollfPropFiles">
<set>
<value>[NODE_NAME]_jms.properties</value>
</set>
</property>
</bean>
PropertyPlaceholderConfigurer中加载properties文件时,实际调用的:org.springframework.core.io.support.PropertiesLoaderSupport中的mergeProperties
Spring源码
protected Properties mergeProperties() throws IOException {
Properties result = new Properties();
if (this.localOverride) {
// Load properties from file upfront, to let local properties override.
loadProperties(result);
}
if (this.localProperties != null) {
for (Properties localProp : this.localProperties) {
//将用户自定义加载的属性值,与spring加载的合并
CollectionUtils.mergePropertiesIntoMap(localProp, result);
}
}
if (!this.localOverride) {
// Load properties from file afterwards, to let those properties override.
loadProperties(result);
}
return result;
}
将多个properties文件中的配置加载以后合并成一个Properties对象返回.
上面的this.setProperties(properties)方法,就是设置localProperties的引用,localProperties不为空的话,将用户自定义加载的properties属性合并到Spring加载的result Properties对象中
localOverride参数:为true的话,表示用户自定义加载的属性值覆盖spring系统加载的,如果同名的话.
自定义使用注意:用户自定义方法的调用务必在spring 初始化调用PropertyPlaceholderConfigurer的mergeProperties()方法之前调用,否则配置文件就没有合并.一般就set值的时候调用.
基本的使用方法是:
<bean id="propertyConfigurerForAnalysis"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/spring/include/dbQuery.properties</value>
</property>
</bean>
其中classpath是引用src目录下的文件写法。
也可以这么写:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/config/jdbc/jdbc.properties</value>
</list>
</property>
</bean>
2.多个Properties文件的配置
当存在多个Properties文件时,配置就需使用locations了:(2)
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/spring/include/jdbc-parms.properties</value>
<value>classpath:/spring/include/base-config.properties</value>
</list>
</property>
</bean>
3.多个PropertyPlaceholderConfigurer来分散配置
接下来我们要使用多个PropertyPlaceholderConfigurer来分散配置,达到整合多工程下的多个分散的Properties文件,其配置如下:(3)
<bean id="propertyConfigurerForProject1"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:/spring/include/dbQuery.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurerForProject2"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="2" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:/spring/include/jdbc-parms.properties</value>
<value>classpath:/spring/include/base-config.properties</value>
</list>
</property>
</bean>
其中order属性代表其加载的顺序,如果没有设置就按照加载xml文件时的顺序,而ignoreUnresolvablePlaceholders为是否忽略不可解析的Placeholder,如果配置了多个PropertyPlaceholderConfigurer,则该属性必须设置且为true,否则propertyConfigurerForProject2的properties文件不会被加载.
至此你已经了解到了如何使用PropertyPlaceholderConfigurer,如何使用多个Properties文件,以及如何配置多个PropertyPlaceholderConfigurer来分解工程中分散的Properties文件。
注意事项:
(1)如果上面的dbQuery.properties与jdbc-parms.properties文件中有相同的参数配置名称,dbQuery.properties中配置的参数值不会被后面的覆盖;
(2)如果jdbc-parms.properties,base-config.properties彼此有相同参数名配置,jdbc-parms.properties中的配置的值会被覆盖;
4.自定义扩展PropertyPlaceholderConfigurer实现
例如:配置文件的路径,需要动态确定的,就需要自己扩展PropertyPlaceholderConfigurer的实现,自己获取文件路径,load properties文件,然后将load后的properties加入PropertyPlaceholderConfigurer
package com.common.spring.ext;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import com.common.exception.ApplicationException;
import com.common.util.GlobalProperties;
import com.common.util.PropertiesUtil;
public class GollfPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
public void setGollfPropFiles(Set<String> gollfPropFiles) {
String propPath = GlobalProperties.getProperty(GlobalProperties.PROPERTIES_FOLDER_PATH); //通过其他配置获取路径
String fileSeparator = System.getProperty("file.separator");
Properties properties = new Properties();
for (String gollfPropFile : gollfPropFiles) {
String nodeName = System.getProperty("weblogic.Name");
gollfPropFile = gollfPropFile.replaceAll("\\[NODE_NAME\\]", nodeName); //NODE_NAME 是根据不同weblogic server确定
String file = propPath + fileSeparator + gollfPropFile;
try {
logger.info("Loading properites file from " + file);
Properties prop = PropertiesUtil.loadProperties(file); //返回properties文件
logger.debug("Properties -> " + prop);
if(prop != null) {
properties.putAll(prop);
}
} catch (Exception e) {
logger.fatal(new ApplicationException("Properties file " + gollfPropFile +
" cannot be found. All related functionalities may be unavailable", e, true));
}
}
this.setProperties(properties); //关键方法,调用的PropertyPlaceholderConfigurer中的方法,
//通过这个方法将自定义加载的properties文件加入spring中
}
}
xml配置
<bean id="auditJmsProperties"
class="com.common.spring.ext.GollfPropertyPlaceholderConfigurer">
<property name="gollfPropFiles">
<set>
<value>[NODE_NAME]_jms.properties</value>
</set>
</property>
</bean>
PropertyPlaceholderConfigurer中加载properties文件时,实际调用的:org.springframework.core.io.support.PropertiesLoaderSupport中的mergeProperties
Spring源码
protected Properties mergeProperties() throws IOException {
Properties result = new Properties();
if (this.localOverride) {
// Load properties from file upfront, to let local properties override.
loadProperties(result);
}
if (this.localProperties != null) {
for (Properties localProp : this.localProperties) {
//将用户自定义加载的属性值,与spring加载的合并
CollectionUtils.mergePropertiesIntoMap(localProp, result);
}
}
if (!this.localOverride) {
// Load properties from file afterwards, to let those properties override.
loadProperties(result);
}
return result;
}
将多个properties文件中的配置加载以后合并成一个Properties对象返回.
上面的this.setProperties(properties)方法,就是设置localProperties的引用,localProperties不为空的话,将用户自定义加载的properties属性合并到Spring加载的result Properties对象中
localOverride参数:为true的话,表示用户自定义加载的属性值覆盖spring系统加载的,如果同名的话.
自定义使用注意:用户自定义方法的调用务必在spring 初始化调用PropertyPlaceholderConfigurer的mergeProperties()方法之前调用,否则配置文件就没有合并.一般就set值的时候调用.
发表评论
-
charles4.2下载与破解方法以及配置https
2020-02-26 09:03 2有两个抓包工具 一个是fidder,一个是charles,两个 ... -
序列号批量生成算法
2019-12-05 14:11 0业务处理过程当中,经常需要生成订单号、序列号等,简单的可 ... -
使用ANTLR处理文本
2019-08-28 17:32 767引用 使用 Antlr 处理文本 https://www.ib ... -
解决maven-metadata.xml文件下载卡死问题
2019-04-11 14:02 3986http://192.168.1.110:8081/nexus ... -
rsync备份和删除指定文件
2018-01-02 10:23 2051文件异地备份时,需要将本地文件合并到服务器上,且不能删除服务器 ... -
javaLocale格式化日期和数字
2017-08-25 09:26 868public static void main(Strin ... -
centos6 tomcat 启动脚本 tomcat服务
2017-08-23 11:24 1441系统自动启动tomcat 复制该脚本到/etc/init.d/ ... -
win7 命令行改IP和DNS
2016-12-21 18:35 738使用管理员权限运行CMD //改DNS netsh ... -
jenkins中集成sonar,使用findbug、pmd、checkstyle提升代码质量
2016-09-29 14:58 6174实际上jenkins单独也 ... -
jenkins 集成sonar
2016-09-18 10:14 0jenkins集成sonar可以从插件中心直接更新安装 son ... -
activeMQ5.14权限配置
2016-08-17 13:47 2673activeMQ默认的消息队列没有用户名和密码,可以直接通过T ... -
solaris 使用解压版的jdk
2016-07-27 15:17 764solaris上配置jdk其实也很简单 由于solaris有 ... -
solaris tomcat开机启动
2016-07-27 16:17 621创建文件夹/var/svc/manifes ... -
HibernateTemplate Vs HibernateDaoSupport Vs Direct Hibernate Access
2016-07-26 11:07 734http://forum.spring.io/forum/sp ... -
spring mvc mybatis will not be managed by Spring
2016-07-20 17:30 9886项目运行时发现事务提交不完整,回滚时只能回滚一半。 系统配置 ... -
java里判断一点是否在某个区域
2016-06-03 17:47 1844import java.awt.geom.Path2D ... -
12306的技术升级
2016-04-20 16:17 1034升级的核心是余票查询的升级,余票查询使用存储过程,sybase ... -
工作流的123
2016-04-20 12:58 575三分钟了解Activity工作流 工作流一般会给开发人员提供流 ... -
sping mvc 使用@Value注解为controller注入值
2016-04-17 17:39 10836spring mvc 里有两个配置文件, 第一个,为sprin ... -
googleapis.com域名访问慢的解决办法
2016-04-13 12:09 9721、安装火狐 2、安装插件ReplaceGoogleCDN
相关推荐
2. **属性文件的顺序**:如果有多个属性文件,Spring会按照文件位置的顺序依次解析,后一个文件中的同名属性会覆盖前一个文件中的值。 3. **系统属性优先级**:通过设置`systemPropertiesMode`,可以选择是否让系统...
`PropertyPlaceholderConfigurer`是Spring提供的一个bean定义解析器,它能够解析bean定义中的${}占位符,并将其替换为属性文件中的相应值。通常,这些属性文件位于项目的类路径下,或者通过classpath:前缀指定其他...
接下来,我们将在Spring的配置文件(如`applicationContext.xml`)中声明一个`PropertyPlaceholderConfigurer` bean,它负责加载并解析Properties文件。配置如下: ```xml class="org.springframework.beans....
Spring读取Properties文件实例解析 Spring框架中,读取Properties文件是一个非常重要的步骤,Properties文件中存储着应用程序的配置信息,如数据库连接信息、Server配置信息等。在Spring应用程序中,我们可以使用@...
Spring 无法读取 properties 文件数据问题详解 Spring 框架在读取 properties 文件数据时可能会遇到一些问题,本文将对这些问题进行详细的解释和解决。 问题一:Controller 中无法读取 properties 文件数据 在 ...
总结来说,Spring通过`PropertyPlaceholderConfigurer`加载属性文件,并提供了两种使用方式:直接在bean配置中引用属性值,或通过注解在Java代码中注入属性。这种方式增强了代码的可维护性和灵活性,使得配置信息...
`PropertyPlaceholderConfigurer`是Spring早期版本中处理属性文件的工具,而`@PropertySource`则是从Spring 3.1引入的新特性,它们都可以用来从外部属性文件中读取值并注入到bean中。 1. `...
这是一个Spring的bean定义类,它允许我们从properties文件中加载和解析属性值,然后将这些值注入到其他bean的属性中。首先,我们需要创建一个properties文件,例如`application.properties`,并放入项目的类路径下...
- **定义**: `PropertyPlaceholderConfigurer`是Spring框架提供的用于解析`properties`文件中定义的占位符的工具类。 - **功能**: 它能够将`properties`文件中的键值对映射到Spring容器中,供其他Bean使用。 **2. ...
Java 获取配置文件的值过程解析 Java 获取配置文件的值过程解析是 Java 开发中一个非常重要的步骤。在大型项目中,通常会有许多系统常量,如数据库的账号和密码、各种 token 值等,这些变量需要统一的管理。如果...
Spring为Java.util.Properties类型的属性进行赋值过程解析 spring框架是Java世界中最流行的框架之一,它提供了许多功能强大且灵活的特性,其中之一就是Property源管理。 在spring中,我们可以使用Java.util....
这里,`PropertyPlaceholderConfigurer` 会查找指定位置(例如 `config.properties`)的属性文件,并将其中的键值对与XML或Java配置中的占位符进行匹配替换。这使得我们的配置更加灵活,可以将一些敏感信息(如...
".properties文件读取及占位符${...}替换源码解析" .properties文件读取及占位符${...}替换是Java开发中常用的技术,通过使用.properties文件来存储配置信息,并使用占位符${...}来替换这些配置信息。下面将详细...
在Java编程中,读取配置文件是常见的任务,它允许我们分离程序的配置...在实际开发中,还可以考虑使用更高级的配置管理框架,如Spring的PropertyPlaceholderConfigurer或YAML解析库,以提升配置管理的便捷性和灵活性。
在SSM(Spring + SpringMVC + MyBatis)框架中,经常需要配置多个属性文件来管理各种配置信息。例如数据库连接信息、系统资源路径等。本文将详细探讨如何在SSM框架中引入多个`properties`文件,并解决可能出现的问题...
Spring MVC还支持属性文件,如`messages.properties`,用于国际化(i18n)。这些文件可以被`ResourceBundleMessageSource`读取,通过`@Value`注解或`Environment`对象获取其中的值。 工具方面,IDEA提供了强大的...
2. **属性文件**:Spring支持从`.properties`文件加载属性,如`messages.properties`用于国际化的本地化信息,或`database.properties`用于存储数据库连接信息。`ResourceBundle`和`PropertyPlaceholderConfigurer`...
在Java开发中,属性文件通常以`.properties`为扩展名,它以键值对的形式存储配置信息。例如,我们可以创建一个名为`application.properties`的文件,其中包含以下内容: ``` database.url=jdbc:mysql://localhost:...
`PropertyPlaceholderConfigurer`允许我们在XML配置文件中使用 `${property}` 形式的占位符,这些占位符的值会在运行时被VM参数或系统属性替换。 例如,我们可以在XML配置中这样使用: ```xml ...
我们可以使用`PropertyPlaceholderConfigurer`或`PropertiesFactoryBean`来加载加密后的属性文件,并在运行时调用`EncryptPropertyFile`类的解密方法,确保Spring在初始化时能够正确解析和加载加密的配置值。...