Spring Boot 如何读取 application.yml 作为配置

Spring Boot 的一大优势是 "约定优于配置" + "配置外部化"。

你不需要写 XML 或硬编码参数,而是把配置放在 application.yml(或 application.properties) 中,Spring Boot 自动加载并注入到你的应用中。

✅ 支持格式:.properties(键值对) 和 .yml(YAML,层次清晰,推荐)

Spring Boot 会按以下顺序查找 application.yml(后出现的会覆盖前面的):

  • 当前项目根目录下的 /config 子目录
  • 当前项目根目录下
  • classpath 下的 /config 包
  • classpath 根路径(即 src/main/resources/)

最常用:src/main/resources/application.yml

基本用法:在代码中读取配置

1.使用 @Value(适合少量配置)

java 复制代码
# application.yml
app:
  name: MySpringBootApp
  version: 1.0.0
java 复制代码
@Component
public class AppConfig {
    @Value("${app.name}")
    private String appName;

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

2.使用 @ConfigurationProperties(推荐!适合结构化配置)

步骤 1:在 application.yml 中配置

java 复制代码
# application.yml
database:
  host: 192.168.1.100
  port: 3307
  username: admin
  password: secret123

步骤 2:定义配置类

java 复制代码
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "database") // 对应 yml 中 database 开头的配置
public class DatabaseConfig {
    private String host = "localhost";
    private int port = 3306;
    private String username;
    private String password;

    // 必须有 getter/setter(或用 Lombok @Data)
    public String getHost() { return host; }
    public void setHost(String host) { this.host = host; }
    public int getPort() { return port; }
    public void setPort(int port) { this.port = port; }
    // ... 其他 setter/getter
}

步骤 3:在其他 Bean 中注入使用

java 复制代码
@Service
public class UserService {
    private final DatabaseConfig dbConfig;

    public UserService(DatabaseConfig dbConfig) {
        this.dbConfig = dbConfig;
    }

    public void connect() {
        System.out.println("连接数据库: " + dbConfig.getHost() + ":" + dbConfig.getPort());
    }
}

支持复杂结构:嵌套对象、List、Map

java 复制代码
# application.yml
app:
  security:
    jwt:
      secret: mySecretKey
      expire-hours: 24
    cors:
      allowed-origins:
        - http://localhost:3000
        - https://myapp.com
java 复制代码
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private Security security = new Security();

    public static class Security {
        private Jwt jwt = new Jwt();
        private Cors cors = new Cors();

        public static class Jwt {
            private String secret;
            private int expireHours;
            // getters/setters
        }

        public static class Cors {
            private List<String> allowedOrigins = new ArrayList<>();
            // getter/setter
        }
        // getters/setters
    }
    // getter for security
}

启用 @ConfigurationProperties 的两种方式

1. 在配置类上加 @Component

java 复制代码
@Component
@ConfigurationProperties(prefix = "xxx")
public class XxxProperties { ... }

2. 在 @Configuration 类上使用 @EnableConfigurationProperties

java 复制代码
@Configuration
@EnableConfigurationProperties({DatabaseConfig.class, AppProperties.class})
public class AppConfig { }

不要同时用两种方式,否则可能创建多个实例

相关推荐
程序员cxuan20 分钟前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
莫逸风20 分钟前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_21 分钟前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
Conan在掘金32 分钟前
�鸿蒙报错速查:Cannot find name 'require',禁用 require(),根因 + 真解法
后端
隔窗听雨眠35 分钟前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
一朵小花1 小时前
记一次Docker 容器 NFS 文件写入延迟排查过程
后端
z123456789861 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211232 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员2 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
FF2501_940228582 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统