全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

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 资源resourceresource="db.properties"最常用,从 classpath 加载
本地文件路径urlurl="file:///etc/myapp/db.properties"适合配置文件在固定路径
网络地址urlurl="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 按照以下顺序加载,后面的会覆盖前面的:

  1. properties 元素体内定义的属性
  2. properties 元素 resource/url 加载的属性
  3. Java 系统属性(System.getProperty()
  4. 环境变量属性(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 < 系统属性 < 环境变量

📝 发现内容有误?点击此处直接编辑

← 上一篇 environments 数据源配置
下一篇 → settings 全局设置
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库