spring中context:property-placeholder标签的使用说明

1,有些参数在某些阶段中是常量。

  1. 在开发阶段我们连接数据库时的url,username,password等信息
    分布式应用中client端的server地址,端口等
  2. 这些参数在不同阶段之间又住住需要改变

期望:有一种方案可以方便我们在一个阶段内不需要频繁写一个参数的值,而在不同阶段间又可以方便的切换参数的配置信息
解决:spring3中提供了一种简便的方式就是``元素
只需要在spring配置文件中添加一句:

<context:property-placeholder location="classpath:jdbc.properties"/>或者<bean id="propertyPlaceholderConfigurer" class="org.springframework,beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>jdbc.properties<value/></list></property>
</bean>

即可,这里的location值为参数配置文件的位置,配置文件通常放到src目录下,参数配置文件的格式即键值对的形式

#jdbc配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

这样一来就可以为spring配置的bean的属性设置值了,比如spring有一个数据源的类

<bean id="dataSource" class="org.springframework,jdbc,datasource.DriverManagerDataSource"><property name="driverClassName" value="${driverClassName}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</bean>

甚至可以将 ${} 这种形式的变量用在spring提供的注解当中,为注解的属性提供值(下面会讲到)

Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个 org.springframework.beans.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描,

换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer 或 <content:property-placeholder>其余的会被Spring忽略。

由于Spring容器只能有一个PropertyPlaceholderConfigurer,如果有多个属性文件,这时就看谁先谁后了,先的保留 ,后的忽略。

还有一种情况,是Spring 自动注入 properties文件中的配置:要自动注入properties文件中的配置,需要在Spring配置文件中添加 org.springframework.beans.factory.config.PropertiesFactoryBean和org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer的实例配置

<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"><property name="locations"><list><value> classpath*:application.properties</value></list></property>
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"><property name="properties" ref="configProperties" />
</bean>

在这个配置文件中我们配置了注解扫描和configProperties实例和propertyConfigurer实例,这样我们就可以在java类中自动注入配置了

@Component
public class Test{@Value("#{configProperties['userName']}")private String userName;public String getUserName(){return userName;}
}

自动注入需要使用 @Value 这个注解,这个注解的格式 #{configProperties[‘userName’]}其中configProperties是我们在配置文件中配置的bean的 id, userName 是在配置文件中配置的项。

同时出现两个该配置时出现错误

<context:property-placeholder location="classpath:a.properties"/>
<context:property-placeholder location="classpath:b.properties"/>

同个模块中如果出现多个context:property-placeholder ,location properties文件后,运行时出现Could not resolve placeholder ‘key’ in string value${key}。

解决办法:

原因是在加载第一个context:property-placeholder时会扫描所有的bean,而有的bean里面出现第二个 context:property-placeholder引入的properties的占位符${key},spring只加载第一个配置,后面的将会被忽略,所以解析不了${key}。

  • 解决办法一:
    可以将通过模块的多个property-placeholder合并为一个,将初始化放在一起。

  • 解决方法二:
    添加ignore-unresolvable=“true”,这样可以在加载第一个property-placeholder时出现解析不了的占位符进行忽略掉。

    <context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties,classpath:filePath.properties"/>

而且这样会导致后面那个b.properties配置文件失效

原因:Spring 只会加载第一个context:property-placeholder配置后面的文件将不会再次进行加载,所以导致后面的文件读取不到

context:property-placeholder标签属性详解

<context:property-placeholder location="属性文件,多个之间逗号分隔"  file-encoding="文件编码"  ignore-resource-not-found="是否忽略找不到的属性文件"  ignore-unresolvable="是否忽略解析不到的属性,如果不忽略,找不到将抛出异常"  properties-ref="本地Properties配置"  local-override="是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性,否则相反"  system-properties-mode="系统属性模式,默认ENVIRONMENT(表示先找ENVIRONMENT,再找properties-ref/location的),NEVER:表示永远不用ENVIRONMENT的,OVERRIDE类似于ENVIRONMENT"  order="顺序"  />

location:表示属性文件位置,多个之间通过如 逗号(,)/分号(;)等分隔;
file-encoding:文件编码;
ignore-resource-not-found:如果属性文件找不到,是否忽略,默认false,即不忽略,找不到将抛出异常;
ignore-unresolvable:是否忽略解析不到的属性,如果不忽略,找不到将抛出异常;
properties-ref:本地java.util.Properties配置;
local-override:是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性;
system-properties-mode:系统属性模式,ENVIRONMENT(默认),OVERRIDE,NEVER

  • ENVIRONMENT:将使用Spring 3.1提供的PropertySourcesPlaceholderConfigurer,其他情况使用Spring 3.1之前的PropertyPlaceholderConfigurer如果是本地覆盖模式:那么查找顺序是:properties-ref、location、environment,否则正好反过来;
  • OVERRIDE: PropertyPlaceholderConfigurer使用,因为在spring 3.1之前版本是没有Enviroment的,所以OVERRIDE是spring 3.1之前版本的Environment如果是本地覆盖模式:那么查找顺序是:properties-ref、location、System.getProperty(),System.getenv(),否则正好反过来;
  • NEVER:只查找properties-ref、location;

order:当配置多个context:property-placeholder/查找顺序;

spring中context:property-placeholder标签详解相关推荐

  1. maven中强大的scope标签详解

    maven中强大的scope标签详解 本文目的   接上一篇maven的版本号version的总结及理解   当我在封装工具jar包的时候,发现有些依赖,是一定要在工具代码里使用的,比如我做的工具包里 ...

  2. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

  3. Spring中的InitializingBean的使用详解

    文章目录 一.InitializingBean作用 二.InitializingBean扩展 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减, ...

  4. MyBatis中动态sql语句标签详解

    动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...

  5. Spring中的循环依赖解决详解

    目录 1 什么是循环依赖? 1.1 构造器循环依赖 1.2 field属性注入循环依赖 1.3 field属性注入循环依赖(prototype) 2 循环依赖处理 2.1 构造器循环依赖(无法解决) ...

  6. Spring中Controller和RequestMapping的详解

    先看一个简单的实例: @Controller @RequestMapping("/hello") public class anyTypeController{@RequestMa ...

  7. Spring中的ApplicationListener的使用详解案例(观察者模式)

    1.ApplicationContext Spring的核心,Context我们通常解释为上下文环境.ApplicationContext则是应用的容器. Spring把Bean(object)放在容 ...

  8. W3C中meta标签详解

    2019独角兽企业重金招聘Python工程师标准>>> meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <meta ...

  9. html中的mata标签详解

    总是有很多朋友问我<meta name="author" content"xxxxx"><meta http-equiv="xx&q ...

最新文章

  1. 微信小程序云数据库触底分页加载,下拉无限加载,第一次请求数据随机,随机获取数据库的数据
  2. ATAC-seq【Harvard FAS Informatics】
  3. SharePoint Online 创建用户和组
  4. dos命令关闭所有dos窗口
  5. 《Effective Java》第8章 通用程序设计
  6. windows下安装Oracle10G
  7. VS Code,请还我文件!!!
  8. 深入到系统组件是否白盒测试_2019年系统集成项目管理工程师:第一章 信息化知识(三)要点?...
  9. 分布式事务,EventBus 解决方案:CAP【中文文档】
  10. 一名毕业生的自述:我知道我必须写论文,但没聪明到可以写出来......
  11. 【转】GPS从入门到放弃(一) --- GPS基础原理
  12. 装逼的翻译,害死多少人,你同意吗?到底什么是非终止状态,终止状态
  13. Spark性能优化指南——基础篇
  14. linux删除权限命令,管理使用者和设立权限的命令
  15. Linux学习笔记 (五)关机和重启命令
  16. 应届毕业生面试软件测试工程师时应注意什么?
  17. GEF: 图形拖拽处理
  18. 【复习篇】高等代数第五版重难知识点整理(1)
  19. XJad反编译工具下载链接及使用教程
  20. PS:学习:一:删除图片不想要的部分

热门文章

  1. 用贪婪算法解决背包问题_解决主要算法问题的贪婪策略
  2. HashMap 为什么在链表长度为 8 的时候转红黑树,为啥不能是 9 是 10?
  3. java数组怎么倒循环_java – 用于数组倒计时的反向循环
  4. .Net Core 开发成长路线图
  5. JQuery Datatables editor 行内编辑功能
  6. LaTeX的安装教程及问题记录
  7. mysql 压力测试知乎_MySQL查看SQL语句执行效率和mysql几种性能测试的工具
  8. 1命名规则 sentinel_Alibaba Sentinel 规则参数总结
  9. android 自定义view滚动条,Android自定义View实现等级滑动条的实例
  10. 疯狂java讲义价格_疯狂java讲义