Spring的属性文件properties使用注意

Spring 中属性文件的配置

通常我们会使用properties文件来设置一些属性,如数据库连接信息,避免进行硬编码,

  1. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  2. <property name="locations">
  3. <list>
  4. <value>classpath:db.properties</value>
  5. //if you want you can add more here.
  6. </list>
  7. </property>
  8. </bean>

或 在Spring 3.1.x. 之后使用 PropertySourcesPlaceholderConfigurer

  1. <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  2. <property name="locations">
  3. <list>
  4. <value>classpath:db.properties</value>
  5. //if you want you can add more here.
  6. </list>
  7. </property>
  8. </bean>

来源: http://stackoverflow.com/questions/28040889/spring-mvc-could-not-resolve-placeholder-in-string-value

更简洁的方法是使用

<context:property-placeholder location="classpath*:config/db.properties" />

问题

在一个多模块maven项目中,不同的模块需要不同的属性配置,因此使用context:property-placeholder配置了两个properties文件:db.propertiesemail.properties,但程序启动时遇到下述错误

caused by java.lang.illegalargumentexception could not resolve placeholder 'mail.sender.password' in string value ${mail.sender.password}

不能处理第二个属性文件中的配置信息

因为Spring不允许定义多个PropertyPlaceholderConfigurer<context:property-placeholder/>

spring中 context:property-placeholder 导入多个独立的 .properties配置文件?

Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的 Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代 PropertyPlaceholderConfigurer了)。

换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的会被Spring忽略掉(其实Spring如果提供一个警告就好了)。

拿上来的例子来说,如果A和B模块是单独运行的,由于Spring容器都只有一个PropertyPlaceholderConfigurer, 因此属性文件会被正常加载并替换掉。如果A和B两模块集成后运行,Spring容器中就有两个 PropertyPlaceholderConfigurer Bean了,这时就看谁先谁后了, 先的保留,后的忽略!因此,只加载到了一个属性文件,因而造成无法正确进行属性替换的问题。

来源: http://blog.csdn.net/yu870646595/article/details/50979338

问题的解决方案

方案1:通配符解决、逗号分隔

使用通配符让spring一次性读取多个属性文件到一个 PropertyPlaceholderConfigurer bean中

<context:property-placeholder location="classpath*:conf/*.properties"/>

来源: http://blog.csdn.net/yu870646595/article/details/50979338

或者使用

<context:property-placeholder location="classpath*:conf/db.properties,conf/email.properties"/>

注意: 如果后一个文件中有和前面某一个文件中属性名是相同的,最终取的值是后加载的值

方案2:一个PropertySourcesPlaceholderConfigurer中包含多个属性文件,和方案1原理相同

  1. <bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  2. <property name="locations">
  3. <list>
  4. <value>classpath:db.properties</value>
  5. <value>classpath:email.properties</value>
  6. </list>
  7. </property>

方案3:使用 ignore-unresolvable

如果一定要分开定义,则在每个PropertySourcesPlaceholderConfigurer配置中添加

<property name="ignoreUnresolvablePlaceholders" value="true"/>

或者在每个context:property-placeholder中都加上ignore-unresolvable="true"

因为在你使用@Value("${xx}")或在xml中使用${xx}获取属性时,Spring会在第一个读取到的属性文件中去找,如果没有就直接抛出异常,而不会继续去第二个属性文件中找

http://stackoverflow.com/questions/18697050/multiple-spring-propertyplaceholderconfigurer-at-the-same-time

http://stackoverflow.com/questions/26657521/spring-multiple-propertyplaceholderconfigurer-in-multiple-projects-how-to-over

http://stackoverflow.com/questions/30616480/spring-value-could-not-resolve-placeholder-in-string-value

Spring的属性文件properties使用注意的更多相关文章

  1. Spring中属性文件properties的读取与使用

    实际项目中,通常将一些可配置的定制信息放到属性文件中(如数据库连接信息,邮件发送配置信息等),便于统一配置管理.例中将需配置的属性信息放在属性文件/WEB-INF/configInfo.propert ...

  2. 【转】spring管理属性配置文件properties——使用PropertiesFactoryBean|spring管理属性配置文件properties——使用PropertyPlaceholderConfigurer

     spring管理属性配置文件properties--使用PropertiesFactoryBean 对于属性配置,一般采用的是键值对的形式,如:key=value属性配置文件一般使用的是XXX.pr ...

  3. 51. spring boot属性文件之多环境配置【从零开始学Spring Boot】

    原本这个章节是要介绍<log4j多环境不同日志级别的控制的>但是没有这篇文章做基础的话,学习起来还是有点难度的,所以我们先一起了解下spring boot属性文件之多环境配置,当然文章中也 ...

  4. Spring中使用属性文件properties的两种方式

    实际项目中,通常将可配置的参数放到属性文件中,例如数据库连接信息.redis连接信息等,便于统一管理.然后通过IoC框架spring将其加载到上下文中,使得程序可以直接使用. 创建mysql.prop ...

  5. Spring MVC 属性文件读取注入到静态字段

    目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用   在项目中,有些参数需要配置到属性文件xxx.pr ...

  6. Spring配置属性文件

    在项目开发阶段和交付阶段数据库的连接信息往往是不同的,可以把这些信息写成属性文件,再在Spring中导入即可引用 jdbc.properties属性文件如下: jdbc.driverClassName ...

  7. Spring对外部属性文件指定的某个属性进行加密、解密

    [From] http://blog.csdn.net/ethanq/article/details/7333897 在我们开发当中,经常会用到spring框架来读取属性文件的属性值,然后使用占位符引 ...

  8. Spring多资源文件properties的配置

    Spring简化了加载资源文件的配置,可以通过<context:property-placeholder去加载,这个元素的写法如下: <context:property-placehold ...

  9. Spring Boot属性文件配置文档(全部)

    This sample file is meant as a guide only. Do not copy/paste the entire content into your applicatio ...

随机推荐

  1. Linux终端界面屏保

    Linux终端界面屏保   在很多Linux使用者的认知里,都认为终端下的Linux操作界面是没有屏保的,只有像windows那样的图形界面下才有屏保.但是其实Linux下也是有屏保的,只不过是ASC ...

  2. 056——VUE中vue-router之路由参数的验证处理保存路由安全

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. WIN8.1 PRO RTM VOL.Enterprise.2013.10.17

    Windows 8.1 Pro VL (x64) - DVD (Chinese-Simplified)ISO|Chinese - Simplified|发布日期: 2013/10/17文件名: cn_ ...

  4. 知名第三方编译版tete009 Firefox 24.0

    Firefox除了官方版本上还有许多由爱好者自己编译修改的第三方版本. 其中 tete009 是十分流行的一个版本,目前tete009 Firefox 24.0 版本发布. tete009版Firef ...

  5. zepto 自定义build

    为啥要自定义build? 一般来说我们都会直接在官网下,但它只包含默认几个的模块,对于移动开发,这些模块有些是需要的,有些则可以不用.所以我们可以根据自己的需要来定制. 下图为zepto包含的模块,其 ...

  6. windows下Java调用mysql的客户端备份和恢复

    这种东西没啥好聊的,其实就是Java执行dos界面下的命令,不过有些要注意就是了,真实dos下面的命令和java调用的windows系统的接口其实还是有一点不同. /** * @param hostI ...

  7. [UOJ46][清华集训2014]玄学

    uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...

  8. Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录

    此为在网络上找来的,觉得很好! 实现目的: 对Mongodb数据库日志按天保存,并且只保留最近7天的日志记录. 具体操作: 使用Mongodb数据库自带的命令来切割日志 ps -def | grep ...

  9. 字符串作为freemarker模板的简单实现例子

    本文转载自:http://blog.csdn.net/5iasp/article/details/27181365 package com.test.demo; import java.io.IOEx ...

  10. bootstrap全局css样式

    以下从官网抄来的,感觉还是很实用的,运用得好,灵活运用,非常方便快捷,能大大提高开发效率,也为调整不同尺寸的屏幕节省了时间. hidden-xs @media (max-width: 767px){ ...