当前位置: 首页 > news >正文

spring中context:property-placeholder/元素

为什么80%的码农都做不了架构师?>>>   hot3.png

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

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

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

                  c、配置文件的位置

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

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

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

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

只需要在spring的配置文件里添加一句:<context:property-placeholder 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.  
  11. <bean name="userInfo" class="test.UserInfo">  
  12.   <property name="username" value="${db.username}"/>  
  13.   <property name="password" value="${db.password}"/>  
  14. </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://my.oschina.net/megan/blog/315685

相关文章:

  • 第二十章、启动流程、模块管理与 Loader
  • 一个体检系统设想
  • 彩生活_百度百科
  • ios 使用自定义字体
  • 从一堆数中随机取出一些值的方法
  • 【MFC】ID命名和数字约定
  • oracle判断视图或者表名存在删除不存在不删除
  • MYSQL 中的变量
  • 记录一些好的Java学习网站
  • c#应用程序如何添加弹出式广告功能
  • javascript函数库
  • 调试时重新生成代码
  • php 多维数组 arrayList array()
  • linux常用命令加实例大全
  • [Ruby on Rails系列]4、专题:Rails应用的国际化[i18n]
  • #Java异常处理
  • [译] React v16.8: 含有Hooks的版本
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 2017年终总结、随想
  • 30秒的PHP代码片段(1)数组 - Array
  • AngularJS指令开发(1)——参数详解
  • CAP 一致性协议及应用解析
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Linux快速复制或删除大量小文件
  • Python进阶细节
  • Spark RDD学习: aggregate函数
  • Vue组件定义
  • 理清楚Vue的结构
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 追踪解析 FutureTask 源码
  • ​520就是要宠粉,你的心头书我买单
  • #if 1...#endif
  • ( 10 )MySQL中的外键
  • (20050108)又读《平凡的世界》
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (7)STL算法之交换赋值
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (备忘)Java Map 遍历
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET Core 成都线下面基会拉开序幕
  • .net core控制台应用程序初识
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net的C#语言取月份数值对应的MonthName值
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET运行机制
  • @property @synthesize @dynamic 及相关属性作用探究
  • [2]十道算法题【Java实现】