Java 属性配置文件读取方法详解

Java 属性配置文件读取方法详解

一、配置文件基础概念

1. 配置文件类型对比

类型格式优点缺点适用场景
Propertieskey=value简单易读,Java原生支持不支持层级结构简单配置,JDBC参数
XML标签层级结构结构化强,支持复杂数据类型冗余,解析复杂复杂配置,Spring旧版本
YAML缩进层级结构简洁易读,支持复杂结构依赖缩进,易出错Spring Boot,云原生应用
JSON键值对结构通用性强,语言无关无注释支持前后端共享配置

2. 配置文件位置策略

graph TDA[配置文件位置] --> B[类路径 resources/]A --> C[文件系统绝对路径]A --> D[相对项目路径]A --> E[网络位置 URL]A --> F[JVM启动参数指定]

二、Properties 文件读取方法

1. 原生 Java 读取方式

import java.io.InputStream;
import java.util.Properties;public class PropertiesLoader {public static void main(String[] args) {Properties prop = new Properties();try (InputStream input = PropertiesLoader.class.getClassLoader().getResourceAsStream("config.properties")) {if (input == null) {throw new RuntimeException("配置文件未找到");}// 加载配置文件prop.load(input);// 获取属性值String dbUrl = prop.getProperty("database.url");int maxConnections = Integer.parseInt(prop.getProperty("pool.max_connections", "10") // 默认值);System.out.println("DB URL: " + dbUrl);System.out.println("Max Connections: " + maxConnections);} catch (Exception e) {e.printStackTrace();}}
}

2. 增强型读取工具类

import java.util.Properties;public class ConfigUtils {private static final Properties properties = new Properties();private static boolean loaded = false;static {loadProperties("application.properties");}private static void loadProperties(String fileName) {try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)) {if (is == null) {throw new FileNotFoundException(fileName + " not found");}properties.load(is);loaded = true;} catch (IOException e) {throw new RuntimeException("加载配置文件失败", e);}}// 获取字符串值public static String getString(String key) {checkLoaded();return properties.getProperty(key);}// 获取整数值(带默认值)public static int getInt(String key, int defaultValue) {try {return Integer.parseInt(getString(key));} catch (NumberFormatException e) {return defaultValue;}}// 获取布尔值public static boolean getBoolean(String key) {return Boolean.parseBoolean(getString(key));}private static void checkLoaded() {if (!loaded) {throw new IllegalStateException("配置文件未加载");}}// 热重载配置文件public static void reload() {properties.clear();loaded = false;loadProperties("application.properties");}
}

三、YAML 文件读取方法

1. SnakeYAML 库读取

<!-- Maven 依赖 -->
<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version>
</dependency>
import org.yaml.snakeyaml.Yaml;
import java.util.Map;public class YamlLoader {public static void main(String[] args) {Yaml yaml = new Yaml();try (InputStream in = YamlLoader.class.getClassLoader().getResourceAsStream("application.yml")) {// 加载为MapMap<String, Object> config = yaml.load(in);// 获取嵌套值Map<String, Object> dbConfig = (Map<String, Object>) config.get("database");String url = (String) dbConfig.get("url");// 获取列表值List<String> servers = (List<String>) config.get("servers");System.out.println("DB URL: " + url);System.out.println("Servers: " + servers);} catch (Exception e) {e.printStackTrace();}}
}

2. 绑定到 Java 对象

public class AppConfig {private Database database;private List<String> servers;private Security security;// getters and setterspublic static class Database {private String url;private String username;private String password;private int maxConnections;// getters and setters}public static class Security {private boolean enabled;private String token;// getters and setters}
}// 读取并绑定
public class YamlToObject {public static void main(String[] args) {Yaml yaml = new Yaml(new Constructor(AppConfig.class));try (InputStream in = YamlToObject.class.getClassLoader().getResourceAsStream("application.yml")) {AppConfig config = yaml.load(in);System.out.println("DB User: " + config.getDatabase().getUsername());} catch (Exception e) {e.printStackTrace();}}
}

四、Spring Boot 配置读取最佳实践

1. 基础配置绑定

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class DatabaseConfig {@Value("${database.url}")private String url;@Value("${database.username}")private String username;@Value("${database.password}")private String password;@Value("${pool.max_connections:20}") // 带默认值private int maxConnections;// 使用配置public void initDataSource() {System.out.println("Connecting to: " + url);}
}

2. 类型安全配置绑定

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private Database database;private List<String> servers;private Security security;// 嵌套静态类public static class Database {private String url;private String username;private String password;private int maxConnections;// getters and setters}public static class Security {private boolean enabled;private String token;// getters and setters}// getters and setters
}// application.yml
app:database:url: jdbc:mysql://localhost/dbusername: rootpassword: secretmax_connections: 50servers:- server1.example.com- server2.example.comsecurity:enabled: truetoken: abc123xyz

3. 多环境配置管理

src/main/resources/
├── application.yml          # 公共配置
├── application-dev.yml      # 开发环境
├── application-test.yml     # 测试环境
└── application-prod.yml     # 生产环境

启动参数指定环境

java -jar myapp.jar --spring.profiles.active=prod

五、高级配置技巧

1. 动态刷新配置

import org.springframework.cloud.context.config.annotation.RefreshScope;@RefreshScope
@Component
public class DynamicConfig {@Value("${dynamic.property}")private String dynamicValue;public String getConfig() {return dynamicValue;}
}

通过 /actuator/refresh 端点刷新配置(需要 Spring Cloud)

2. 加密敏感配置

import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;public class SecureConfig {@Autowiredprivate StringEncryptor encryptor;@Value("${encrypted.property}")private String encryptedProperty;public String getDecryptedValue() {return encryptor.decrypt(encryptedProperty);}
}

3. 自定义配置源

import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.PropertySource;@Configuration
public class CustomPropertySourceConfig {@Beanpublic PropertySource<?> customPropertySource() {Map<String, Object> properties = new HashMap<>();properties.put("custom.property", "value-from-db");return new MapPropertySource("customSource", properties);}
}

六、配置读取安全最佳实践

1. 敏感信息处理

风险解决方案实现方式
密码明文存储使用加密配置Jasypt, Spring Cloud Config 加密
配置文件泄露配置文件与代码分离外部化配置(K8s ConfigMap, Vault)
生产配置误用环境隔离Spring Profiles, 独立配置文件

2. 配置审计策略

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;@Component
public class ConfigAuditor {private final Environment env;public ConfigAuditor(Environment env) {this.env = env;}@EventListener(ApplicationReadyEvent.class)public void auditConfiguration() {System.out.println("=== 配置审计报告 ===");System.out.println("Active Profiles: " + Arrays.toString(env.getActiveProfiles()));System.out.println("DB URL: " + env.getProperty("spring.datasource.url"));System.out.println("Security Enabled: " + env.getProperty("app.security.enabled"));// 记录到审计日志...}
}

七、性能优化方案

1. 配置读取优化策略

场景优化方案效果
高频访问配置缓存配置值减少重复解析
大型配置文件按需加载减少启动内存占用
分布式配置客户端缓存+版本校验减少网络请求
敏感配置延迟解密启动时不暴露敏感信息

2. 高效配置缓存实现

public class ConfigCache {private static final Map<String, Object> cache = new ConcurrentHashMap<>();private static final Properties properties = new Properties();static {// 初始化加载配置try (InputStream is = ConfigCache.class.getResourceAsStream("/application.properties")) {properties.load(is);} catch (IOException e) {throw new RuntimeException("配置加载失败", e);}}// 获取缓存配置public static Object getProperty(String key) {return cache.computeIfAbsent(key, k -> {Object value = properties.get(k);if (value instanceof String) {// 处理加密值等}return value;});}// 刷新缓存public static void refresh() {cache.clear();}
}

八、配置读取完整流程示例

应用程序配置管理器文件系统环境变量请求配置值(key)返回缓存值读取配置文件返回文件内容解析配置检查环境变量覆盖返回环境变量值应用默认值(如有)缓存结果返回最终值alt[内存缓存存在][需要加载]应用程序配置管理器文件系统环境变量

九、总结:配置读取最佳实践

1. 技术选型指南

场景推荐方案
简单Java应用Properties + 工具类
Spring Boot应用@ConfigurationProperties
复杂配置结构YAML + 配置类
微服务/云原生Spring Cloud Config
高安全要求HashiCorp Vault

2. 配置管理黄金法则

  1. 环境隔离:严格区分dev/test/prod环境配置
  2. 安全第一:绝不将敏感信息提交到代码仓库
  3. 外部化配置:配置文件与应用程序分离
  4. 版本控制:所有配置文件纳入版本管理
  5. 配置监控:实时监控配置变更和生效状态
  6. 默认安全:设置安全相关的默认值
  7. 文档化:维护配置项说明文档

3. 配置读取检查清单

  • 配置文件位置正确(类路径/resources)
  • 配置文件名符合规范(application-{profile}.yml)
  • 敏感信息已加密处理
  • 提供了合理的默认值
  • 支持环境变量覆盖
  • 配置变更有监控和告警
  • 配置项有完整的文档说明

架构师建议:在现代应用架构中,配置管理已从简单的文件读取发展为独立的基础设施。对于关键业务系统,建议采用专业的配置中心(如Spring Cloud Config、Apollo、Nacos),实现配置的集中管理、版本控制、实时推送和审计跟踪,将配置读取提升到新的专业水平。

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

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

相关文章

NW728NW733美光固态闪存NW745NW746

美光NW系列固态闪存深度解析&#xff1a;NW728、NW733、NW745与NW746的全方位评测技术架构与核心创新美光NW系列固态闪存&#xff08;包括NW728、NW733、NW745、NW746&#xff09;的技术根基源于其先进的G9 NAND架构。该架构通过5纳米制程工艺和多层3D堆叠技术&#xff0c;在单…

【面试八股文】2025最新软件测试面试

一、测试基础 1、测试策略或测试包括哪些&#xff0c;测试要覆盖哪些方面 UI、功能、性能、可靠性、易用性、兼容性、安全性、安装卸载 2、设计测试用例的办法 等价类、边界值、错误推测法、场景法等设计方法来编写测试用例的 &#xff08;1&#xff09;等价类分为有效等价…

AI软件出海SEO教程

一、出海SEO核心思路 本地化&#xff1a;内容、技术、用户体验全面适应目标市场。关键词策略&#xff1a;围绕目标用户的真实搜索习惯做关键词挖掘和布局。内容为王&#xff1a;持续输出高质量、解决用户痛点的内容。技术优化&#xff1a;保证网站速度、结构、移动端体验及安全…

PyVision:基于动态工具的具身智能体

论文地址&#xff1a; [2507.07998v1] PyVision: Agentic Vision with Dynamic Tooling 1. 背景 现有的智能体一般都是通过大模型规划调用已经预定义好的一些工具&#xff08;具体来说也就是一些函数&#xff09;来解决问题。这样就会导致在针对特征的任务上Agent去解决问题…

Higress 上架 KubeSphere Marketplace,助力企业构建云原生流量入口

随着企业数字化转型持续深化&#xff0c;云原生架构正逐渐成为构建现代应用的主流选择。而服务治理作为云原生落地的核心能力之一&#xff0c;急需更灵活、高效的解决方案。近日&#xff0c;AI 原生的 API 网关 Higress 正式上架 KubeSphere Marketplace&#xff0c;助力用户轻…

在LC480T上部署xapp1052

实验环境&#xff1a;LC480T加速卡 开发环境&#xff1a;windows11vivado2020 运行环境&#xff1a;ubuntu22.04 硬件电路&#xff1a;LC480T加速卡(xc7k480tffg1156-2) vivado工程文件下载&#xff1a;https://download.csdn.net/download/xiaolangyangyang/91349686 驱动及应…

TCP的socket编程

TCP客户端逻辑void Usage(const std::string & process) {std::cout << "Usage: " << process << " server_ip server_port" <<std::endl; } // ./tcp_client serverip serverport int main(int argc, char * argv[]) {if (ar…

【理念●体系】模板规范篇:打造可标准化复用的 AI 项目骨架

【理念●体系】从零打造 Windows WSL Docker Anaconda PyCharm 的 AI 全链路开发体系-CSDN博客 【理念●体系】Windows AI 开发环境搭建实录&#xff1a;六层架构的逐步实现与路径治理指南-CSDN博客 【理念●体系】路径治理篇&#xff1a;打造可控、可迁移、可复现的 AI 开…

Skia---渐变色着色器

今天介绍的是实际工作中最常用到的着色器&#xff1a;渐变色着色器。 渐变色着色器是一个从一种颜色平滑的过渡到另一种颜色的效果&#xff0c;渐变色着色器的作用主要是增强图形的视觉吸引力。 线性渐变 Skia 里的线性渐变色着色器是最简单的渐变色着色器&#xff0c;它用于…

2025.07.09华为机考真题解析-第二题200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 地铁线路故障预警系统 问题描述 LYA 负责管理一个城市的地铁网络系统。地铁网络由 n n n

数学建模:非线性规划:凸规划问题

一、定义凸集定义​​&#xff1a;设Ω是n维欧氏空间的一点集&#xff0c;若任意两点x₁∈Ω&#xff0c;x₂∈Ω&#xff0c;其连线上的所有点αx₁(1-α)x₂∈Ω&#xff0c;(0≤α≤1)&#xff0c;则称Ω为凸集。​​凸函数定义​​&#xff1a;给定函数f(x)(x∈D⊂Rⁿ)&…

ISIS | 广播网络中的 ISIS 伪节点 LSP

注&#xff1a;本文为 “ISIS | 伪节点 LSP” 相关合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 如有内容异常&#xff0c;请看原文。 ISIS in Broadcast Network and Pseudonode LSP 广播网络中 的 ISIS 伪节点 LSP ISIS in broadcast network is…

ARIA UWB安全雷达主要产品型号与核心功能全解析

ARIA UWB雷达拥有LT系列与AHM系列两大产品线。LT103 XBT、LT102 V2、LT103 OEM等代表型号具备高精度定位、低功耗和强穿透能力&#xff0c;适用于工业自动化与物联网。AHM3D、AHM2D、AHM3DSC则专注三维检测和智能计算&#xff0c;广泛服务于医疗健康、安防监控等场景。Hydrogen…

NLP自然语言处理04 transformer架构模拟实现

总体架构输入部分代码实现:导包# -*-coding:utf-8-*- import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn # -*-coding:utf-8-*- import copy import torch.nn.functional as F import math位置编码器部分词嵌入WordEmbedding# todo 作用…

记录一本书: Python机器学习:基于PyTorch和Scikit-Learn

记录一本书&#xff1a; Python机器学习&#xff1a;基于PyTorch和Scikit-Learn 作者&#xff1a;&#xff08;美&#xff09;塞巴斯蒂安拉施卡(Sebastian Raschka)&#xff08;美&#xff09;刘玉溪&#xff08;海登&#xff09;(Yuxi(Hayden)Liu) &#xff08;美&#xff09;…

Datomic数据库简介(TBC)

Datomic 数据库详细介绍 Datomic 是一个由 Rich Hickey&#xff08;Clojure 语言创始人&#xff09;设计的 不可变、时间感知、分布式数据库&#xff0c;专为现代应用程序设计&#xff0c;强调 数据不变性&#xff08;immutability&#xff09;、查询灵活性和可审计性。它结合…

xformers 完整安装教程【pip conda】(解决 conda 版本 pytorch 自适应安装 xformers)

我个人喜欢用 mamba&#xff08;conda&#xff09;创建环境&#xff0c;然后用 mamba 安装 pytorch CUDA&#xff08;如果需要使用 CUDA 编译&#xff09;&#xff0c;还有一些比如 gcc/g 等与 python 无关的一些工具。 但是最近我在扩充环境的时候&#xff0c;发现需要额外安…

VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程

VM虚拟机全版本秘钥&#xff0c;文章末尾。 首先网络穿透的意义是让公网可以直接访问家庭电脑&#xff0c;这样本地电脑的硬件性能得以完全发挥&#xff0c;特别是在云服务器贵性能又没家庭电脑好&#xff0c;专线宽带又贵&#xff0c;第三方网络穿透贵的场景下。一般第三方网…

C++ - 仿 RabbitMQ 实现消息队列--项目介绍与环境搭建

目录 项目介绍 开发环境 技术选型 环境搭建 安装 wget(一般情况下默认会自带) 更换国内软件源 安装 lrzsz 传输工具 安装编译器 安装项目构建工具 make 安装调试器 安装 git 安装 cmake 安装 Protobuf 安装 Muduo 安装 SQLite3 安装 Gtest 项目介绍 首先说一下…

《目标检测模块实践手册:从原理到落地的尝试与分享》第一期

大家好&#xff0c;欢迎来到《目标检测模块实践手册》系列的第一篇。从今天开始&#xff0c;我想以一种 “实践记录者” 的身份&#xff0c;和大家聊聊在目标检测任务中那些形形色色的模块。这些内容没有权威结论&#xff0c;更多的是我在实际操作中的一些尝试、发现和踩过的坑…