spring中context:property-placeholder标签详解

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/查找顺序;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

access mysql oracle数据库_Oracle Access 数据库连接 使用

直接代码吧&#xff1a;/// /// Oracle数据库连接/// /// 数据库连接串&#xff0c;例如&#xff1a;(DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST IP)(PORT *)))(CONNECT_DATA (SERVICE_NAME *)))/// 用户名/// 用户密码/// Oracle数据库连接对象private st…

Jackson用法详解

Spring MVC 默认采用Jackson解析Json&#xff0c;尽管还有一些其它同样优秀的json解析工具&#xff0c;例如Fast Json、GSON&#xff0c;但是出于最小依赖的考虑&#xff0c;也许Json解析第一选择就应该是Jackson。 一、简介 Jackson 是当前用的比较广泛的&#xff0c;用来序列…

php7 cms,PHP7CMS 无条件前台GETSHELL

Version:2018-10-09//最新版中以修复此漏洞这个漏洞很简单&#xff0c;如果作者在写代码的时候考虑到一点点安全方面&#xff0c;其实都可以避免的。[PHP] 纯文本查看 复制代码// php7cms/Core/Controllers/Api/Api.php// 52~61 linepublic function save_form_data() {$rt \P…

php服务器怎么设置cookie,php服务器如何清除浏览器cookie

php服务器清除浏览器cookie的方法&#xff1a;1、设置cookie的过期时间&#xff1b;2、设置cookie的值为空&#xff0c;代码为【setcookie($cookiename, ) setcookie($cookiename, NULL);】。php服务器清除浏览器cookie的方法&#xff1a;一、设置cookie的过期时间//将过期时间…

Java面试——RabbitMQ系列总结

1.RabbitMQ是什么&#xff1f; RabbitMQ是一款开源的&#xff0c;Erlang编写的&#xff0c;基于AMQP&#xff08;高级消息队列协议&#xff09;协议的消息中间件。 2.为什么要使用消息队列&#xff1f; 从本质上来说是因为互联网的快速发展&#xff0c;业务不断扩张&#xff0c…

商城系统php功能模块,yershop商城系统的支付模块问题

这个商城系统是用ThinkPHP框架进行开发的&#xff0c;但是有很多毛病就不吐槽了。最崩溃的毛病是商城的核心功能??支付功能有语法错误导致无法支付。如图&#xff1a;求教大神&#xff0c;这该怎么改&#xff0c;纠结了好久好久。。。。。在这里数组中使用C方法就报错。代码片…

php ini 长连接秒数,php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据...

$address "127.0.0.1";$port 9090; //调试的时候&#xff0c;可以多换端口来测试程序&#xff01;set_time_limit(0);$sock socket_create(AF_INET, SOCK_STREAM, SOL_TCP);socket_set_block($sock);socket_bind($sock, $address, $port);socket_listen($sock, 4)…

php swoole udp,基于Swoole如何搭建UDP服务?

本节将会讲解如下2个问题&#xff1a;通过Swoole如何搭建UPD服务&#xff1f;对比TCP和UDP有什么不同&#xff1f;01通过Swoole如何搭建UPD服务新建一个文件命名为 udp_server.php&#xff0c;代码如下&#xff1a;在命令行执行如下命令就可以开启TCP服务&#xff1a;php udp_s…

php net-snmp trap,Net-snmp:接收Trap的api

Net-snmp:接收Trap的apiNet-snmp:接收Trap的apinet-snmp使用的是snmptrapd来接收trap&#xff0c;我想自己写程序接收trap&#xff0c;也看了snmptrapd.c代码&#xff0c;很繁琐。有没有更简单一点的例子。net-snmp作为管理端功能有点欠缺&#xff0c;可以使用snmp毕业论文-- B…

SpringBoot引入本地jar包

1.引入本地jar包并通过maven打包成jar包 第一步&#xff1a;创建lib包&#xff0c;将所需的本地jar包导入 第二步&#xff1a;在pom文件中引导路径 <dependency><groupId>com.penn</groupId><artifactId>excleutil</artifactId><version&g…

“2021-01-30T16:00:00.000Z“: expected format “yyyy-MM-dd HH:mm:ss“时间戳格式化

“2021-01-30T16:00:00.000Z”&#xff1a; T表示分隔符&#xff0c;Z表示的是UTC. UTC&#xff1a;世界标准时间&#xff0c;在标准时间上加上8小时&#xff0c;即东八区时间&#xff0c;也就是北京时间。 例如 &#xff1a; 北京时间&#xff1a;2021-01-31 00:00:00对应的国…

MyBatis JdbcType介绍

MyBatis JdbcType介绍 JdbcType介绍 数据库列字段都是有类型的&#xff0c;不同的数据库有不同的类型。为了表示这些数据类型&#xff0c;Java源码是采用枚举来定义的&#xff1a; public enum JDBCType implements SQLType {TINYINT(Types.TINYINT),SMALLINT(Types.SMALLIN…

php 物联网应用,蜂窝物联网的概念以及应用

所谓蜂窝物联网&#xff0c;就是蜂窝移动通信网物联网相结合的发展产物。如今蜂窝移动通信网络已经发展30多年了&#xff0c;高高的通信铁塔拔地而起&#xff0c;随处可见&#xff0c;比工业时代的烟囱可多多了&#xff0c;象征着辉煌的信息时代。蜂窝物联网建设原则 本期工程要…

JSONObject.parseObject()

java获取json中某个字段 import com.alibaba.fastjson.JSONObject; public class JsonTest {public static void main(String[] args) {// json串(以自己的为准)String str "{"id":"75","shoppingCartItemList":[{"id":"4…

python批量图片转pdf,用python 制作图片转pdf工具

最近因为想要看漫画&#xff0c;无奈下载的漫画是jpg的格式&#xff0c;网上的转换器还没一个好用的&#xff0c;于是乎就打算用python自己DIY一下&#xff1a;这里主要用了reportlab。开始打算随便写几行&#xff0c;结果为若干坑纠结了挺久&#xff0c;于是乎就想想干脆把代码…

Java中如何遍历Map对象的4种方法

在Java中如何遍历Map对象 *How to Iterate Over a Map in Java* 在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。 既然java中的所有map都实现了Map接口&#xff0c;以下方法适用于任何map实现&#xff08;HashMap, TreeMap, LinkedHashMap, Hashtable, 等…

大学本科 java教材,大学本科自学java之路——IO

大学本科自学java之路——IO大学本科自学java之路——IO我现在大三&#xff0c;大一&#xff0c;大二就是玩&#xff0c;现在大三准备考虑就业了&#xff0c;特写博客便于坚持自己学习一. 字节缓冲流的构造方法&#xff1a;BufferedOutputStream:该类实现缓冲输出流。 通过设置…

Map的value转化为其它类型

map的values() Collection<String> v map.values(); 转化为数组或者List集合 转化为List: List<String> lnew ArrayList<String>(map.values()); for(String s:l){System.out.print(s); }转化为数组 1.直接为Object[]数组 Object[] array map.values(…

下载的oracle如何解压,深度概述Ubuntu oracle下载解压

oracle经过长时间的发展&#xff0c;我发表对Ubuntu oracle个人讲解&#xff0c;叙述下Ubuntu oracle使用。Ubuntu 包含了非常好的翻译和容易使用的架构&#xff0c;这些由自由软件社团将不断的提供, 将尽可能的使大多数人方便使用 Ubuntu 。1. 先到 Ubuntu oracle 网站上下载了…

关于比较器Comparator排序时间的问题

​ 最近涉及一个需要按照时间排序的问题&#xff0c;由于在数据库层面order by太麻烦&#xff0c;所以就准备在代码层面解决&#xff0c;但是过程中遇到了一个很有意思的问题。 ​ 先介绍一下用的比较器的api&#xff1a; o1大于o2,则返回正数&#xff1b;o1等于o2,则返回0&…