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
英文地址,請注明出處:http://en.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;更多的是我在實際操作中的一些嘗試、發現和踩過的坑…