首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SpringBoot】properties && yaml && @Value && @PostConstruct

【SpringBoot】properties && yaml && @Value && @PostConstruct

原创
作者头像
lirendada
发布2026-06-12 12:57:11
发布2026-06-12 12:57:11
820
举报
文章被收录于专栏:JavaJava

概述

  1. .properties 文件以键值类型配置,而 .yml 文件采用树形配置方式。
  2. 读取配置文件内容,使用 @Value 注解,注解内使用 "${}" 的格式读取对应内容。
  3. yml 层级之间严格使用换行缩进的方式配置,keyvalue 之间使用冒号加空格的方式设置,并且空格不可省略
  4. properties 作为早期并且默认的配置文件格式,其配置存在一定的冗余数据,而使用 yml 可以很好的解决数据冗余的问题,但不适合复杂配置。
  5. yml 可以和 properties 共存,如果存在冲突的内容,优先读取 properties 文件中的内容

Ⅰ. 什么是 Spring Boot 配置文件

Spring Boot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到 Spring Boot 的目的。很多项目或者框架的配置信息也放在配置文件中,比如:

  1. 项目的启动端口
    1. Spring Boot 内置了 Tomcat 服务器,默认端口号是 8080,但是用户电脑上 8080 端口号有可能就被其他应用程序占用了,所以 Spring Boot 需要支持让用户自定义端口号。
  2. 数据库的连接信息(包含用户名和密码的设置)
    1. 为了更方便简单的访问数据库,出现了一些持久层框架,其实就是对 JDBC 进行了更深层次的封装。让用户通过简单几行代码就可完成数据库的访问。但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。
  3. 第三方系统的调用密钥等信息
  4. 用于发现和定位问题的普通日志和异常日志等

Spring Boot 配置文件有以下三种:

  • application.properties
  • application.yml(是 yaml 的简写)
  • application.yaml

当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.propertiesapplication.yaml 或者 application.yml 文件。 也可以通过 spring.config.name 指定文件路径和名称,参考https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config.files

Ⅱ. properties 配置文件:@Value && @PostConstruct

官方配置文档

基本的语法是键值对的形式,键值对之间用 = 隔开,如下所示:

代码语言:javascript
复制
# 配置项⽬端⼝号
server.port=9090

#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

读取的时候,使用 @Value 注解搭配 ${} 格式读取,如下所示:

代码语言:javascript
复制
@Controller
public class demo1 {
    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String name; // 不需要和键同名

    @Value("${spring.datasource.password}")
    private String passwd; // 不需要和键同名

    @PostConstruct
    public void init() {
        System.out.println(url);
        System.out.println(name);
        System.out.println(passwd);
    }
}

@PostConstruct 注解的方法会在 当前 BeanSpring 完全初始化之后 自动执行一次,常用于初始化逻辑。

执行顺序如下所示: static代码块(类加载时) → 构造方法 → 依赖注入 → @PostConstruct -> Bean ready 💥注意:static 代码块是在类加载阶段就执行的,比 @PostConstruct 要早得多

Ⅲ. yml 配置文件

yml 是树形结构的配置文件,它的基础语法是 "key: value",其中 keyvalue 之间使用英文冒号加空格的方式组成,并且空格不可省略

代码语言:javascript
复制
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    
#正确的配置方式
mykey1: java

#错误的配置方式❌
mykey2:java

注意:value 值默认不用加上单引号或者双引号

yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,如下所示:

代码语言:javascript
复制
@Controller
public class demo2 {
    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String name; // 不需要和键同名

    @Value("${spring.datasource.password}")
    private String passwd; // 不需要和键同名

    @Value("${mykey1}")
    private String mykey; // 不需要和键同名

    @PostConstruct
    public void init() {
        System.out.println(url);
        System.out.println(name);
        System.out.println(passwd);
        System.out.println(mykey);
    }
}

一、配置不同数据类型

注意对应的类型在 java 后端接收的时候要使用对应的类型接收,不然容易出现类型不匹配的错误!

代码语言:javascript
复制
# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value1: true
boolean.value2: false

# 整数
int.value: 10

# 浮点数
float.value: 3.14159

# Null,用~表示
null.value: ~

# 空字符串
# 虽然直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来
empty.value: ''

二、Map(字典 / 键值对)

YAML 中的 Map 表示的是一组 key: value 键值对,和 Java 的 Map<String, Object> 类似。

代码语言:javascript
复制
database:
  host: localhost
  port: 3306
  username: root
  password: 123456

可以理解为:

代码语言:javascript
复制
{
  "database": {
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "123456"
  }
}

三、List(集合 / 数组)

YAML 中的 List 是通过 -(短横线)表示的。

✅ 简单列表

代码语言:javascript
复制
fruits:
  - apple
  - banana
  - orange

相当于:

代码语言:javascript
复制
{
  "fruits": ["apple", "banana", "orange"]
}

✅ 列表中的 Map

代码语言:javascript
复制
servers:
  - name: server1
    ip: 192.168.1.1
  - name: server2
    ip: 192.168.1.2

相当于 Java 中的 List<Map<String, String>>

代码语言:javascript
复制
{
  "servers": [
    { "name": "server1", "ip": "192.168.1.1" },
    { "name": "server2", "ip": "192.168.1.2" }
  ]
}

✅ Map 中包含 List

代码语言:javascript
复制
user:
  name: liren
  hobbies:
    - coding
    - hiking
    - reading

等同于:

代码语言:javascript
复制
{
  "user": {
    "name": "liren",
    "hobbies": ["coding", "hiking", "reading"]
  }
}

四、@ConfigurationProperties 读取 Map 和 List

代码语言:javascript
复制
myapp:
  name: liren
  tags:
    - java
    - spring
    - yaml
  metadata:
    version: v1.0
    author: liren dada
  servers:
    - name: server1
      ip: 192.168.1.1
    - name: server2
      ip: 192.168.1.2

创建如下配置类:

代码语言:javascript
复制
@Data
@Component
@ConfigurationProperties("myapp") // 注意名称要对应
public class MyApp {
    private String name;                  // 普通字段
    private List<String> tags;            // List
    private Map<String, String> metadata; // Map
    private List<Server> servers;         // 嵌套自定义对象
    
    @Data
    public static class Server {
        private String name;
        private String ip;
    }
}

然后使用配置类:

代码语言:javascript
复制
@Controller
public class demo {
    @Autowired
    private MyApp app;

    @PostConstruct
    public void init() {
        System.out.println(app);
    }
}

// 运行结果:
MyApp(name=liren, tags=[java, spring, yaml], metadata={version=v1.0, author=liren dada}, servers=[Server(name=server1, ip=192.168.1.1), Server(name=server2, ip=192.168.1.2)])

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • Ⅰ. 什么是 Spring Boot 配置文件
  • Ⅱ. properties 配置文件:@Value && @PostConstruct
  • Ⅲ. yml 配置文件
    • 一、配置不同数据类型
    • 二、Map(字典 / 键值对)
    • 三、List(集合 / 数组)
      • ✅ 简单列表
      • ✅ 列表中的 Map
      • ✅ Map 中包含 List
    • 四、@ConfigurationProperties 读取 Map 和 List
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档