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

比如 :a、在开发阶段我们连接数据库时的连接url,username,password,driverClass等

b、分布式应用中client端访问server端所用的server地址,port,service等

c、配置文件的位置

2.而这些参数在不同阶段之间又往往需要改变

比如:在项目开发阶段和交付阶段数据库的连接信息往往是不同的,分布式应用也是同样的情况。

期望:能不能有一种解决方案可以方便我们在一个阶段内不需要频繁书写一个参数的值,而在不同阶段间又可以方便的切换参数配置信息

解决:spring3中提供了一种简便的方式就是context:property-placeholder/元素  

只需要在spring的配置文件里添加一句location="classpath:jdbc.properties"/> 即可,这里location值为参数配置文件的位置,参数配置文件通常放在src目录下,而参数配置文件的格式跟java通用的参数配置文件相同,即键值对的形式,例如:

#jdbc配置

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

行内#号后面部分为注释

应用:

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

在配置文件里这么定义bean:

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

2.甚至可以将${ }这种形式的变量用在spring提供的注解当中,为注解的属性提供值

---------------------------------------------------------  

外在化应用参数的配置

在开发企业应用期间,或者在将企业应用部署到生产环境时,应用依赖的很多参数信息往往需要调整,比如LDAP连接、RDBMS JDBC连接信息。对这类信息进行外在化管理显得格外重要。PropertyPlaceholderConfigurer和PropertyOverrideConfigurer对象,它们正是担负着外在化配置应用参数的重任。????

 < context:property-placeholder/>元素

PropertyPlaceholderConfigurer实现了BeanFactoryPostProcessor接口,它能够对<bean/>中的属性值进行外在化管理。开发者可以提供单独的属性文件来管理相关属性。比如,存在如下属性文件,摘自userinfo.properties。
db.username=scott
db.password=tiger

如下内容摘自propertyplaceholderconfigurer.xml。正常情况下,在userInfo的定义中不会出现${db.username}、${db.password}等类似信息,这里采用PropertyPlaceholderConfigurer管理username和password属性的取值。DI容器实例化userInfo前,PropertyPlaceholderConfigurer会修改userInfo的元数据信息(<bean/>定义),它会用userinfo.properties中db.username对应的scott值替换${db.username}、db.password对应的tiger值替换${db.password}。最终,DI容器在实例化userInfo时,UserInfo便会得到新的属性值,而不是${db.username}、${db.password}等类似信息。

  1. < bean id="propertyPlaceholderConfigurer"
  2. class="org.springframework.beans.factory.config.
  3. PropertyPlaceholderConfigurer">
  4. <property name="locations">
  5. <list>
  6. <value>userinfo.properties</value>
  7. </list>
  8. </property>
  9. < /bean>
  10. < bean name="userInfo" class="test.UserInfo">
  11. <property name="username" value="${db.username}"/>
  12. <property name="password" value="${db.password}"/>
  13. < /bean>

通过运行并分析PropertyPlaceholderConfigurerDemo示例应用,开发者能够深入理解PropertyPlaceholderConfigurer。为简化PropertyPlaceholderConfigurer的使用,Spring提供了<context:property-placeholder/>元素。下面给出了配置示例,启用它后,开发者便不用配置PropertyPlaceholderConfigurer对象了。

  1. < context:property-placeholder location="userinfo.properties"/>

PropertyPlaceholderConfigurer内置的功能非常丰富,如果它未找到${xxx}中定义的xxx键,

它还会去JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找。

通过启用systemPropertiesMode和searchSystemEnvironment属性,开发者能够控制这一行为。

转载于:https://www.cnblogs.com/xingzc/p/5821273.html

spring中context:property-placeholder/元素相关推荐

  1. spring中context:property-placeholder标签详解

    spring中context:property-placeholder标签的使用说明 1,有些参数在某些阶段中是常量. 在开发阶段我们连接数据库时的url,username,password等信息 分 ...

  2. spring中父子bean集合元素合并问题

    spring支持集合核定的功能,允许子bean继承父bean的同名属性集合元素,并将子bean中配置的集合属性值和父bean中配置的同名属性值合并起来作为最终bean的属性值: <bean id ...

  3. 基于Xml 的IOC 容器-载入<property>元素

    BeanDefinitionParserDelegate 在解析<Bean>调用parsePropertyElements()方法解析<Bean>元素中的<propert ...

  4. 通过Spring配置文件中bean中的property赋值

    基本数据类型赋值-通过spring配置文件中bean中的property 扩展-以此方式可以通过配置为连接数据的属性赋值 1.如果是基本数据类型,可以通过setter方法为对象中的属性设置初始值,应用 ...

  5. Spring 中的 context

    Spring 中的 context BeanFactory 首先看下,官方在代码中给出的注释: The root interface for accessing a Spring bean conta ...

  6. Spring配置中context:annotation-config VS context:component-scan

    Spring 中在使用注解(Annotation)会涉及到< context:annotation-config> 和 < context:component-scan>配置, ...

  7. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  8. 关于Spring 中的PortletModeHandlerMapping

    在Spring Portlet MVC中,我们可以用PortletModeHandlerMapping来将Portlet模式绑定到对应的Handler上,并且再这里可以声明拦截器,示例代码如下: &l ...

  9. Spring中BeanPostProcessor

    Spring提供了很多扩展接口,BeanPostProcessor接口和InstantiationAwareBeanPostProcessor接口就是其中两个. BeanPostProcessor B ...

最新文章

  1. 【C 语言】字符串拷贝 ( 指针使用前判空 | while 空语句 )
  2. redis 面试问题问答Top 10
  3. JavaFX控件ID:设置Label文本内容代码示例
  4. 【CodeForces - 674B 】Bear and Two Paths(贪心,思维,水题)
  5. linux qt usb转串口通信,centos7 Qt USB转串口通信
  6. php 生成随机数组,利用php如何获取随机数组列表
  7. 浅谈WebView的使用
  8. iOS10.2越狱图文教程 iOS10.2越狱工具
  9. 如何去掉图片上的logo
  10. 操作系统的作用及基本特性
  11. 3.样条曲线之B样条曲线
  12. 使用python批量解压7z格式压缩包
  13. 体验国际编程大赛(完成报名可抽奖)
  14. Android热修复之Tinker集成最新详解
  15. 分布式Ruby解决之道
  16. 概率论(三)- 全概公式逆概公式(贝叶斯公式)
  17. 【程序设计】程序错误与异常处理
  18. IOT设备配网绑定通讯流程
  19. 5000英镑就可买到控制美国核武库的同款IBM电脑
  20. C++ 标准库函数与宏定义的名字冲突

热门文章

  1. 多台电脑集群运算_一个分布式服务器集群架构方案
  2. 外呼机器人起名_电销外呼机器人如此受欢迎,今天终于知道原因了
  3. arraylist扩容是创建新数组吗 java_Java 基础数据结构分析
  4. antd中tooltip换行_ant design 中实现表格头部可删除和添加
  5. 查询、新增、修改、删除方法
  6. java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出
  7. mysql 报错10614_PostgreSQL转换为Mysql
  8. java 弹性碰撞_球体弹性碰撞位置和速度计算算法
  9. 截取台风后的图片_Python数据分析案例 | 台风最喜欢在我国哪个省市登陆
  10. css动漫效果库,Animate.css功能强大的纯CSS3动画库 - 资源分享