0

0

Spring Boot 有哪几种读取配置的方式?

幻影之瞳

幻影之瞳

发布时间:2025-09-05 13:28:01

|

987人浏览过

|

来源于php中文网

原创

Spring Boot通过application.properties/yml、@Value、@ConfigurationProperties、环境变量、命令行参数等多种方式读取配置,并按优先级生效,其中命令行参数优先级最高,支持多环境Profile管理,推荐使用@ConfigurationProperties处理结构化配置以提升可维护性。

spring boot 有哪几种读取配置的方式?

Spring Boot在读取配置方面提供了多种灵活且强大的机制,最常见且基础的包括

application.properties
application.yml
文件、通过
@Value
注解直接注入单个属性、以及利用
@ConfigurationProperties
注解将一组相关配置绑定到Java对象上。此外,它还支持从环境变量、命令行参数、JNDI等多种外部源加载配置,并遵循一套严格的优先级规则,确保在不同场景下配置的灵活性和可覆盖性。

Spring Boot在配置管理上的设计,在我看来,简直是神来之笔。它不仅提供了一系列开箱即用的配置方式,更重要的是,它建立了一套清晰的优先级体系,让开发者能够非常灵活地管理应用程序在不同环境下的行为。

解决方案

我们来深入聊聊Spring Boot那些读取配置的“看家本领”。

首先,最基础也是最常用的,无疑是

application.properties
application.yml
文件
。这是Spring Boot应用程序的默认配置中心。当项目启动时,Spring Boot会自动加载这些文件。我个人更偏爱YAML格式,因为它通过缩进清晰地展现了配置的层次结构,写起来也更直观、更整洁,尤其是在配置项比较多、结构比较复杂的时候,可读性远超传统的
.properties
文件。比如,一个数据库连接配置,在YAML里可能是这样的:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: user
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

而对应的

.properties
文件则会是扁平的:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

这两种文件都支持通过

application-{profile}.yml
application-{profile}.properties
来定义特定环境的配置,比如
application-dev.yml
用于开发环境,
application-prod.yml
用于生产环境,通过
spring.profiles.active
属性或环境变量来激活。

接下来是

@Value
注解。这是一种非常直接的方式,用于将单个配置属性注入到Spring管理的Bean的字段或方法参数中。它的语法很简单,通常是
@Value("${some.property.key}")

@Component
public class MyService {

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

    @Value("${app.version:1.0.0}") // 可以设置默认值
    private String appVersion;

    public void printInfo() {
        System.out.println("App Name: " + appName + ", Version: " + appVersion);
    }
}

@Value
用起来很方便,特别是当你只需要获取少数几个不相关的配置项时。但如果你的配置项很多,而且它们之间有逻辑上的关联,都散落在不同的
@Value
注解中,那代码就会显得有些臃肿和难以维护。这时候,你就需要考虑更高级的武器了。

那就是

@ConfigurationProperties
注解。这是我个人在处理复杂配置时最喜欢的方式。它允许你将一组相关的配置属性绑定到一个POJO(Plain Old Java Object)上,实现类型安全的配置。Spring Boot会自动将配置源中以特定前缀开头的属性映射到POJO的字段上。

@Component
@ConfigurationProperties(prefix = "app.settings")
public class AppSettings {
    private String name;
    private String description;
    private List<String> features; // 支持集合类型

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }
    public List<String> getFeatures() { return features; }
    public void setFeatures(List<String> features) { this.features = features; }
}

然后在

application.yml
中:

app:
  settings:
    name: My Awesome App
    description: A powerful application for everything.
    features:
      - User Management
      - Data Analytics
      - Reporting

在其他组件中,你就可以直接注入

AppSettings
对象来获取所有相关配置,代码会非常清晰和优雅。这种方式不仅提供了类型安全,还支持数据校验(通过
@Validated
),甚至可以很好地支持复杂的嵌套结构,简直是配置管理者的福音。

除了文件和注解,Spring Boot还会从环境变量和命令行参数中读取配置。这两种方式的优先级通常高于文件配置,非常适合在部署时动态调整某些关键参数,而无需修改和重新打包应用程序。例如,

java -jar myapp.jar --server.port=8081
会覆盖
application.properties
中定义的端口。环境变量的命名规则通常是将点号分隔的属性名转换为大写,并用下划线替换点号,比如
SERVER_PORT
对应
server.port

最后,对于更高级或动态的场景,Spring Boot的

Environment
抽象和
PropertySource
机制提供了更底层的控制。你可以直接注入
Environment
对象来程序化地获取任何配置属性,或者自定义
PropertySource
来从任意来源加载配置。这通常用于集成一些非标准配置源,或者进行一些复杂的配置处理逻辑。

歌者PPT
歌者PPT

歌者PPT,AI 写 PPT 永久免费

下载

Spring Boot配置加载的优先级是怎样的?

理解Spring Boot配置的加载优先级是至关重要的,它决定了当同一个属性在不同地方被定义时,哪个值会最终生效。Spring Boot采用了一种非常精细且多层次的“外部化配置”策略,其优先级从高到低大致遵循以下顺序:

  1. 命令行参数(Command-line arguments):这是优先级最高的。当你通过
    java -jar your-app.jar --server.port=8081
    这种方式启动应用时,
    --server.port=8081
    会覆盖所有其他来源的
    server.port
    配置。
  2. SPRING_APPLICATION_JSON
    :在环境变量中嵌入的JSON配置,或者作为系统属性。
  3. ServletConfig初始化参数:在
    web.xml
    @ServletComponentScan
    中定义的参数。
  4. ServletContext初始化参数:同样在
    web.xml
    中定义。
  5. JNDI属性:来自
    java:comp/env
  6. Java系统属性(System properties):通过
    java -Dkey=value
    设置的属性。
  7. 操作系统环境变量(OS environment variables):例如
    SERVER_PORT=8081
    。需要注意的是,Spring Boot会将环境变量名中的下划线转换为点,并将所有字母转换为小写,以匹配属性名。
  8. application-{profile}.properties
    application-{profile}.yml
    :特定于活动profile的配置。例如,如果
    spring.profiles.active=dev
    ,那么
    application-dev.yml
    application-dev.properties
    的配置会在这里生效。
  9. application.properties
    application.yml
    :位于当前目录或classpath根目录下的标准配置文件。
  10. @PropertySource
    注解
    :通过
    @PropertySource
    注解加载的配置。
  11. 默认属性(Default properties):Spring Boot内部定义的默认值。

这个优先级列表并非一成不变的,有些情况会略有调整,但核心思想是:离应用程序启动和运行环境越近、越动态的配置源,其优先级越高。 这使得我们可以在不修改代码和打包文件的情况下,通过调整外部环境参数来灵活控制应用程序的行为。举个例子,我通常会在

application.yml
中定义开发环境的数据库连接,但在生产环境部署时,我会通过环境变量或者命令行参数来覆盖数据库连接信息,这样既安全又方便。

什么时候应该使用@Value,什么时候使用@ConfigurationProperties?

这是一个非常常见的选择题,也是我在实际开发中经常需要权衡的地方。简单来说,它们各有优势,适用于不同的场景。

使用

@Value
的场景:

  • 获取单个、不相关的配置项:当你的Bean只需要一两个独立的配置值时,比如一个应用的名称、一个固定的API密钥,
    @Value
    是最简洁、最直接的选择。
  • 快速原型开发或临时性配置:在项目初期或者某个功能模块需要快速验证时,用
    @Value
    可以快速获取配置,减少额外的POJO定义。
  • 需要设置默认值
    @Value("${key:defaultValue}")
    这种语法可以直接在注解中提供默认值,非常方便。
  • 处理Spring表达式语言(SpEL)
    @Value
    支持SpEL,可以实现更复杂的表达式求值,例如
    @Value("#{systemProperties['java.version']}")

@Value
的缺点:

  • 缺乏类型安全:它返回的是字符串,你需要手动进行类型转换,容易出错。
  • 代码冗余:如果一个类需要注入很多配置项,每个都用
    @Value
    会导致代码非常冗长,且难以阅读。
  • 难以管理:相关的配置项分散在代码各处,不利于统一管理和查找。
  • 不支持复杂结构:无法直接映射嵌套对象或集合。

使用

@ConfigurationProperties
的场景:

  • 获取一组相关、结构化的配置项:这是它的核心优势。当你的配置项具有共同的前缀,并且在逻辑上属于一个整体时,比如数据库连接信息、第三方API客户端配置、自定义业务参数等,
    @ConfigurationProperties
    是最佳选择。
  • 实现类型安全的配置:它将配置直接映射到POJO的字段上,Spring Boot会自动完成类型转换,大大减少了运行时错误。
  • 支持复杂的数据结构:POJO可以包含嵌套对象、List、Map等,完美地映射YAML或Properties中的复杂结构。
  • 数据校验:结合
    @Validated
    注解和JSR 303/380(Bean Validation)规范,你可以对配置属性进行强大的校验,确保配置值的有效性,比如
    @Min
    ,
    @Max
    ,
    @NotNull
    等。
  • 利于代码重构和维护:将配置集中到一个POJO中,使得配置的查找、修改和重构变得非常容易。

我的个人建议是:

  • 如果只是偶尔需要一个或两个独立的、简单的配置值,
    @Value
    是完全可以的。
  • 但凡是涉及到一组相关联的配置,或者配置项数量超过两三个,并且可能在未来扩展,果断选择
    @ConfigurationProperties
    。它虽然初期需要定义一个POJO,但从长远来看,它能带来更好的可维护性、类型安全和代码清晰度。在大型项目中,我几乎总是优先考虑
    @ConfigurationProperties
    ,它能让配置管理变得井井有条。

如何在不同环境中管理Spring Boot配置?

在实际的软件开发和部署中,应用程序往往需要在不同的环境(开发、测试、生产、UAT等)下运行,每个环境可能需要不同的配置,比如数据库连接、日志级别、外部服务地址等。Spring Boot提供了一套非常成熟和灵活的机制来应对这种挑战。

  1. 使用Profile(配置文件): 这是Spring Boot管理多环境配置最核心、最常用的方式。你可以在

    application.yml
    application.properties
    的基础上,创建特定环境的配置文件,例如:

    • application-dev.yml
      (开发环境)
    • application-test.yml
      (测试环境)
    • application-prod.yml
      (生产环境)

    这些特定环境的配置文件会覆盖

    application.yml
    (或
    application.properties
    )中相同名称的属性。要激活某个Profile,你可以在启动应用时通过以下方式指定:

    • 命令行参数
      java -jar your-app.jar --spring.profiles.active=prod
    • 环境变量
      SPRING_PROFILES_ACTIVE=prod java -jar your-app.jar
    • 系统属性
      java -Dspring.profiles.active=prod -jar your-app.jar
    • application.yml
      中设置默认Profile
      spring:
        profiles:
          active: dev # 默认激活dev profile

      我通常会在

      application.yml
      中放置所有环境通用的配置,然后在
      application-{profile}.yml
      中放置特定环境的差异化配置。这种方式非常直观和高效。

  2. 操作系统环境变量和命令行参数: 正如前面提到的,环境变量和命令行参数拥有更高的优先级。这对于在容器化部署(如Docker、Kubernetes)场景下管理配置尤为重要。你可以通过容器编排工具(如

    docker-compose.yml
    或Kubernetes的
    Deployment
    配置)来设置环境变量,从而在运行时动态地注入配置,而无需修改镜像。例如,在Docker中设置数据库URL:

    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://prod-db:3306/prod_db

    这种方式在生产环境中非常流行,因为它将配置与应用程序代码解耦,提高了部署的灵活性和安全性。

  3. 外部化配置服务器(如Spring Cloud Config): 对于微服务架构或大型分布式系统,仅仅依靠文件和环境变量可能不够灵活。Spring Cloud Config提供了一个中心化的配置服务,可以将所有微服务的配置存储在一个Git仓库中,并提供HTTP接口供服务获取。

    • 优点
      • 集中管理:所有服务的配置都集中在一个地方。
      • 版本控制:配置存储在Git中,可以进行版本管理、回滚和审计。
      • 动态刷新:可以在不重启应用的情况下刷新配置。
      • 安全性:支持配置加密。
    • 工作原理:Config Server从Git仓库(或其他后端)读取配置,客户端服务(Config Client)在启动时向Config Server请求配置。

    虽然引入Config Server会增加一些架构复杂性,但对于管理几十甚至上百个微服务的配置来说,它带来的便利性和可维护性是无与伦比的。我个人在处理大型微服务项目时,几乎总是会考虑引入Spring Cloud Config。

  4. 自定义

    PropertySource
    : 在某些特殊场景下,你可能需要从非标准来源加载配置,比如自定义的数据库表、远程API接口、或者一个特定的文件格式。这时,你可以通过实现
    PropertySource
    接口来创建自定义的配置源。这需要一些Spring框架的深入知识,但提供了极大的灵活性。

综合来看,Spring Boot提供了从简单到复杂、从静态到动态的多层次配置管理方案。对于大多数项目,Profile结合环境变量已经足够应对;而对于大型分布式系统,引入Spring Cloud Config则能带来更高的效率和可维护性。选择哪种方式,最终还是取决于项目的规模、复杂度和团队的技术栈偏好。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

161

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

89

2026.01.26

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

139

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

408

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

73

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

150

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

271

2025.12.24

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

33

2026.02.11

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号