Spring Boot读取配置文件的五种方式小结

2025-04-25 17:50

本文主要是介绍Spring Boot读取配置文件的五种方式小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进...

Spring Boot 提供了灵活多样的方式来读取配置文件(如 application.yml 或 application.properties),本文介绍几种常见的读取方式。

1. 配置文件位置与加载顺序

Spring Boot 默认从以下位置加载配置文件(优先级从高到低):

命令行参数(如:--server.port=8081)

application.properties / application.yml(位于 classpath:/config/)

classpath:/application.properties 或 application.yml

外部配置中心(如 Nacos、Spring Cloud Config)

2. 读取配置文件的方式汇总

Spring Boot 提供了多种读取配置文件的方式。

方式一:使用 @Value 注解读取配置

这种方式适合读取单个简单配置项。可以用来注入配置文件中的值,也可以指定默认值,防止配置项缺失时抛出异常 。

配置文件:

app:
  name: order-v
  version: v1

示例代码:

@Component
public class AppProperties {

    @Value("${app.name:order}")
    private String name;

    @Value("${app.version:v1.0.0}")
    private String version;

    public void print() {
        System.out.println("App Name: " + name);
        System.out.println("App Version: " + version);
    }
}
  • : 后面就是默认值
  • 当配置文件中没有对应的值时,会使用默认值
  • 如果配置项存在对应的值,默认值不生效

测试代码:

@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }
}

✅ 优点:

简单直接,适用于读取单个变量

❌ 缺点:

不支持嵌套结构、不支持批量绑定、不利于维护

方式二:使用 @ConfigurationProperties 自动绑定配置类(推荐)

适合绑定多个字段、嵌套结构、List、Map等复杂配置。

配置文件:

app:
  name: order-v
  version: v1
  servers:
    - http://dev-server:8080
    - http://test-server:8081
    - http://prod-server:8082
  metadata:
    author: Alice
    version: 1.0.2
    website: https://emp.com
  modules:
    user:
      enabled: true
      path: /user
    admin:
      enabled: false
      pyElssdbath: /admin

配置类示例代码:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import Java.util.List;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "app")
@Data
public class AppProperties {

    private String name;

    // List 示例
    private List<String> servers;

    // Map<String, String> 示例
    private Map<String, String> metadata;

    // Map<String, 自定义对象> 示例
    private Map<String, Module> modules;

    @Data
    public static class Module {
        private boolean enabled;
        private String path;
    }
    
    public void print() {
        System.out.println("name: " + name);
        System.out.println("servers: " + servers);
        System.out.println("metadata: " + metadata);
        System.out.println("modules: " + modules);
    }
}

使用示例:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }
}

✅ 优点:

  • 支持对象结构、嵌套对象、List、Map
  • 支持校验(配合 @Validated)
  • 强类型绑定,IDE 支持友好

❌ 缺点:

需要额外的类定义

方式三:使用 Environment 编程式读取配置

适合动态读取、条件判断场景。

示例代码:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/24 17:28
 **/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;
    private final Environment env;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMjavascriptapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }

    @RequestMapping("/printEnv")
    public void printEnv() {
        String name = env.getProperty("app.name");
        System.out.println("app.name = " + name);
    }

}

✅ 优点:

  • 动态、灵活,支持条件判断
  • 可用于第三方库或工具类中

❌ 缺点:

可读性差,不支持自动绑定

方式四:加载自定义配置文件(@PropertySource)

当你需要读取非 application.yml 的配置文件时使用。

自定义配置文件 sms-config.properties:

sms.sign=aliyun
sms.template.code=TPL001

示例代码:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/25 10:08
 **/
@Configuration
@PropertySource("classpath:sms-config.properties")
@ConfigurationProperties(prefix = "sms")
@Data
public class SmsConfig {
    private String sign;
    private Template template;

    @Data
    public static class Template {
        private String code;
    }

    public void print() www.chinasem.cn{
        System.out.println("sign : " + sign);
        System.out.println("template.code : " + template.getCode());
    }
}

使用示例:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example编程.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/24 17:28
 **/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;
    private final SmsConfig smsConfig;
    private final Environment env;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }

    @RequestMapping("/printEnv")
    public void printEnv() {
        String name = env.getProperty("app.name");
        System.out.println("app.name = " + name);
    }


    @RequestMapping("/smsConfig")
    public void smsConfig() {
        smsConfig.print();
    }

}

✅ 优点:

  • 支持加载自定义配置文件
  • 可与 @ConfigurationProperties 搭配使用

❌ 缺点:

  • 不支持 .yml 格式
  • 不支持动态刷新

方式五:多环境配置(多 Profile)

适用于开发、测试、生产环境的配置隔离。

配置文件:

# application-dev.yml
app:
  name: DevApp

# application-prod.yml
app:
  name: ProdApp

激活方式:

在 application.yml 中设置:

spring:
  profiles:
    active: dev

或通过启动参数:

--spring.profiles.active=prod

✅ 优点:

  • 多环境隔离,配置清晰
  • 支持组合激活多个 profile

总结

场景推荐方式
读取单个简单值@Value
读取嵌套结构、对象@ConfigurationProperties
动态读取Environment
非默认配置文件@PropertySource
多环境支持多 profile

以上就是Spring Boot读取配置文件的五种方式小结的详细内容,更多关于Spring Boot读取配置文件的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Spring Boot读取配置文件的五种方式小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154369

相关文章

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组