properties 属性文件
使用 properties 元素可以将数据库连接等配置信息从 XML 中提取到独立文件中,便于管理和维护。
为什么需要外部化配置
直接在 XML 中硬编码数据库连接信息存在以下问题:
- 敏感信息(密码)暴露在代码中,存在安全风险
- 切换环境需要修改 XML 文件,容易误改其他配置
- 配置无法被非技术人员修改,协作成本高
通过 properties 文件外部化配置后:
- 敏感信息可单独加密或纳入版本控制忽略列表
- 切换环境只需替换或加载不同文件
- 运维人员可以直接修改 properties 文件,无需改动 XML
创建属性文件
创建 db.properties 文件:
properties
# db.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
db.username=root
db.password=123456
在 XML 中引入属性文件
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用 ${key} 占位符引用属性 -->
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
注意:
resource用于 classpath 下的文件,url用于绝对路径或网络地址。
properties 引入方式
| 方式 | 属性 | 示例 | 说明 |
|---|---|---|---|
| classpath 资源 | resource | resource="db.properties" | 最常用,从 classpath 加载 |
| 本地文件路径 | url | url="file:///etc/myapp/db.properties" | 适合配置文件在固定路径 |
| 网络地址 | url | url="http://config-server/db.properties" | 适合集中配置管理 |
多环境属性文件
为不同环境创建独立的属性文件:
properties
# db-dev.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/dev_db?useSSL=false
db.username=root
db.password=root
properties
# db-test.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://192.168.1.100:3306/test_db?useSSL=false
db.username=test_user
db.password=test_pass
properties
# db-prod.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://prod-db-server:3306/prod_db?useSSL=true
db.username=prod_app
db.password=${ENCRYPTED:abc123xyz}
在 XML 中通过占位符引用,由构建系统或环境变量决定加载哪个文件。
属性优先级
当存在多个来源的属性时,MyBatis 按照以下顺序加载,后面的会覆盖前面的:
properties元素体内定义的属性properties元素resource/url加载的属性- Java 系统属性(
System.getProperty()) - 环境变量属性(
System.getenv())
示例:
XML
<properties resource="db.properties">
<!-- 在元素体内定义的属性优先级最低 -->
<property name="db.driver" value="com.mysql.cj.jdbc.Driver"/>
</properties>
Java
// Java 代码设置的系统属性会覆盖 properties 文件中的值
System.setProperty("db.password", "new_password");
属性加密方案
方案一:使用 Jasypt 加密
依赖:
XML
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
</dependency>
加密后的属性文件:
properties
# db-encrypted.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mydb
db.username=root
db.password=ENC(dGhpcyBpcyBlbmNyeXB0ZWQ=)
方案二:使用自定义 Properties 解析
创建自定义的解密逻辑:
Java
public class DecryptedProperties extends Properties {
@Override
public String getProperty(String key) {
String value = super.getProperty(key);
if (value != null && value.startsWith("ENC(")) {
// 执行解密逻辑
return decrypt(value.substring(4, value.length() - 1));
}
return value;
}
}
属性文件最佳实践
- 将
db.properties加入.gitignore,避免敏感信息提交到代码仓库 - 在代码仓库中保留
db.properties.example作为模板文件 - 生产环境密码通过运维系统注入环境变量,不写入文件
- 使用统一的属性命名前缀(如
db.)避免命名冲突
要点总结
- 使用
<properties resource="db.properties"/>引入外部属性文件 - 在 XML 中使用
${key}占位符引用属性值 - 支持 classpath、本地文件和网络地址三种引入方式
- 多环境可通过创建不同属性文件实现切换
- 敏感信息应加密存储或通过环境变量注入
- 属性加载优先级:元素体内 < resource/url < 系统属性 < 环境变量
📝 发现内容有误?点击此处直接编辑