1 问题概述
spring在读取properties文件属性时,当文件属性与系统属性冲突时,会读取到系统属性值。
2 问题复现
2.1 读取properties文件
- 创建maven工程
- 在pom.xml文件中添加spring坐标
- 在resources目录下创建spring配置文件
- 将配置文件内容改为以下内容
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
-
- 在resources目录下创建test.properties文件
- 在test.properties文件内添加
username=123
- 加载test.properties文件
- 在spring配置文件中添加如下代码
<context:property-placeholder location="classpath:test.properties"/>
2.2 读取文件属性
- 在java目录下创建Test.java文件用于输出读取到的属性
-
package cn.qiguai; public class Test { private String str; public void setStr(String str) { this.str = str; } public void save() { System.out.println("str = " + str); } }
-
- 读取文件属性(利用${})
- 创建TestDemo.java文件输出读取到的数据
package cn.qiguai;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
public static void main(String[] args) {
//获取容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Test test = (Test) ac.getBean("test");
test.save();
}
}
- 我们预期结果应该是
str = 123
,而观察控制台输出结果却为str = Administrator
3 原因
test.properties文件中username属性与系统属性名称冲突,而系统属性优先级高于文件属性,因此读取到的就是系统属性。
4解决方案
在如下位置添加如下代码,让spring取消加载系统属性