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 { }

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

相关推荐
2分钟速写快排2 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
面向Google编程2 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
lhldsg2 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都3 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒3 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!3 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰4 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
小荷才露尖尖角,早有蜻蜓立上头4 小时前
过滤器的4种创建方式
java
大圣编蚕5 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法