Springboot配置文件相关语法及读取方式详解

 更新时间:2025年12月11日 14:27:13   作者:hi,你礼貌吗  
本文主要介绍了Spring Boot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方式,同时,还介绍了使用@ConfigurationProperties注解和Environment接口读取配置文件的方法,并提供了具体的读取示例

配置文件的形式

目前,springboot的配置文件有2种形式。

1、.properties文件,一般习惯称其为properties文件,e.g.application.properties;

2、.yml/.yaml文件(2个后缀都是一样的文件,一般常用.yml),一般习惯称其为yaml文件,e.g.application.yml/application.yaml;

语法

它只有2种核心语法,一种是key-value,一种是数组,以下以.yml文件为主。

1、key-value形式

它支持字符串类型(支持转义字符,比如\n同样会换行,本质就是String类型),数字类型和boolean类型,如下:

# .yml文件示例
config0:
  string: abcd      # 字符串
  number: 123       # 数字类型
  boolean: true     # boolean类型


# .properties文件示例
# config0.string=abcd
# config0.number=123
# config0.boolean=true

最常见的读取方式示例如下:

@Value("${config0.string}")
private String config0String;

@Value("${config0.number}")
private int config0Number;

@Value("${config0.boolean}")
private boolean config0Boolean;

.yml文件还有另外一种行内写法(可读性很差,所以并不常用),如下:

# 注意相关空格,且没有任何引号。否则无法识别抛出异常
config0: {string: abcd,number: 123,boolean: true}

注:行内写法并不能直接转为map,也只能通过config0.string...进行读取。

2、数组形式

它支持字符串类型(支持转义字符,比如\n同样会换行,本质就是String类型),数字类型和boolean类型,如下:

# .yml文件示例,注意相关空格
config1:
  list:
    - abcd     # 字符串类型
    - 123      # 数字类型
    - true     # boolean类型


# .properties文件示例
#config1.list[0]=abcd
#config1.list[1]=123
#config1.list[2]=true

最常见的读取方式示例如下:

@Value("${config1.list[0]}")
private  String config1String;
	
@Value("${config1.list[1]}")
private  int config1Number;
	
@Value("${config1.list[2]}")
private  boolean config1Boolean;

.yml文件还有另外一种行内写法(可读性很差,所以并不常用),如下:

config1:
  list: [abcd, 123, true]

注:行内写法并不能直接转为list,也只能通过config1.list[0]...进行读取。

总结:不管配置文件多么的花里胡哨,都是由上面2种类型构造而成。如下尝试构建一个复杂的配置文件。

# .yml文件示例
config2: 
  card: 
  - visa: 招商银行信用卡
  - visa: 浦发银行信用卡
  - 建设银行
  - 中国银行
  - 农业银行
  - 工商银行
  name: 张三
  age : 28


# .properties文件示例
# config2.card[0].visa=招商银行信用卡
# config2.card[1].visa=浦发银行信用卡
# config2.card[2]=建设银行
# config2.card[3]=中国银行
# config2.card[4]=农业银行
# config2.card[5]=工商银行
# config2.name=张三
# config2.age=28

读取方式如下:

@Value("${config2.card[0].visa}")
private String visa1;
	
@Value("${config2.card[1].visa}")
private String visa2;
	
@Value("${config2.card[2]}")
private String bankcard1;
	
@Value("${config2.card[3]}")
private String bankcard2;
	
@Value("${config2.card[4]}")
private String bankcard3;
	
@Value("${config2.card[5]}")
private String bankcard4;
	
@Value("${config2.name}")
private String name;
	
@Value("${config2.age}")
private int age;

说明:上面的写法是不能直接转为java代码中的map和list,不过,它是支持直接转为map和list的。但是,直接转为map和list和上面的写法实现的目的是一样的,需要遵循一些特殊写法,如果需要在代码中传递map或者list,在代码中重新构造即可,利用配置文件直接转map或list,就是脱裤子放屁,核心就是上面的2种语法。

读取方式

1、通过@value注解

上面已经对其进行过说明,这里举例说明一下,直接将配置项转map有多鸡肋。

配置项:

config: 
  map: '{"name": "张三", "age": 18}'

代码:

// 外面需要包一个#{}
@Value("#{${config.map}}")
private Map<String, Object> configMap;

我认为,它不仅可读性差,还容易出错,如果需要使用map,还不如读取3个配置项,重新构造一个map对象。

注:不管是直接转map的表达式还是上面的数组项读取,都是由SpringEL表达式提供解析。

2、通过@ConfigurationProperties注解

使用@ConfigurationProperties注解的时候,建议引入以下jar包(编译器会出现警告):

<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

它常用于批量解析配置项,所以构建配置类的时候,用它就特别方便。

它与@Value有以下区别

1、@ConfigurationProperties不支持SringEL表达式,所以这里注意,它不能解析key-value与数组结合的形式,如下:

如果引入了<spring-boot-configuration-processor>jar包,这种复杂写法编译器会在配置文件中报错的。

# @ConfigurationProperties不能解析
config: 
  card: 
    - visa: 招商银行信用卡
    - visa: 浦发银行信用卡
    - 建设银行
    - 中国银行
    - 农业银行
    - 工商银行

2、@ConfigurationProperties对于直接map和list比较方便;

3、@ConfigurationProperties支持JSR303数据校验。

@ConfigurationProperties注解常用属性

1、prefix:用于指定配置项前缀;

2、value:同prefix,建议使用prefix,语义更明显;

3、ignoreInvalidFields:忽略受校验的字段,默认false;

4、ignoreUnknownFields忽略未识别的字段,默认true。

配置文件:

config: 
  user: 
    name: 张三
    cards: 
      - 招商银行
      - 建设银行
    age: 28
    map: {key1: value1,key2: value2}

读取代码:

注:用@ConfigurationProperties读取的时候,一定要提供set方法。

@Component
@ConfigurationProperties(prefix = "config.user")
public class UserBean {

	private String name;
	
	private List<String> cards;
	
	private String age;
	
	private Map<String, String> map;


    // 省略get/set

}

3、通过Environment(org.springframework.core.env.Environment)读取

配置文件:

# 注意相关空格
config1:
  list:
    - abcd     # 字符串类型
    - 123      # 数字类型
    - true     # boolean类型

读取代码:

// 常用下面2个方法,一个是默认以String类型读取,一个是指定类型读取
String config0String = env.getProperty("config0String");
int config0Number = env.getProperty("config0Number", Integer.class);
boolean config0Boolean = env.getProperty("config0Boolean", Boolean.class);

根据实际场景,选择最适合的方式就是好方式。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的MyBatis框架中关键的XML字段映射的配置参数详解

    Java的MyBatis框架中关键的XML字段映射的配置参数详解

    将XML文件的schema字段映射到数据库的schema是我们操作数据库的常用手段,这里我们就来整理一些Java的MyBatis框架中关键的XML字段映射的配置参数详解,需要的朋友可以参考下
    2016-06-06
  • Java获取请求头、参数、路径方式

    Java获取请求头、参数、路径方式

    这篇文章主要介绍了Java获取请求头、参数、路径方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 使用SpringBoot和Redis实现高效缓存机制方式

    使用SpringBoot和Redis实现高效缓存机制方式

    本文讲解如何在SpringBoot中集成Redis,通过注解和自定义策略实现高效缓存,优化包括合理过期、预热、避免穿透与击穿,提升应用性能
    2025-08-08
  • Java多线程 自定义线程池详情

    Java多线程 自定义线程池详情

    这篇文章主要介绍了Java多线程 自定义线程池,文章主要是学习代码,没有过多解析,需要的朋友可以参考一下文章的具体内容
    2021-10-10
  • Java实现的断点续传功能的示例代码

    Java实现的断点续传功能的示例代码

    本篇文章主要介绍了Java实现的断点续传功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 深入探究如何使用Java编写MapReduce程序

    深入探究如何使用Java编写MapReduce程序

    MapReduce是一种用于处理大规模数据集的并行编程模型,其特点高效性和可扩展性,在本文中,我们将深入了解MapReduce,并使用Java编写一个简单的MapReduce程序,需要的朋友可以参考下
    2023-05-05
  • 全面解析Java设计模式之单例模式

    全面解析Java设计模式之单例模式

    这篇文章主要帮助大家全面解析Java设计模式之单例模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 一文教你学会如何使用MyBatisPlus

    一文教你学会如何使用MyBatisPlus

    本篇文章,我们通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-05-05
  • @FeignClient 实现简便http请求封装方式

    @FeignClient 实现简便http请求封装方式

    这篇文章主要介绍了@FeignClient 实现简便http请求封装方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java8新特性Stream流详解

    Java8新特性Stream流详解

    Java8 Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作,本文就将带着你如何使用 Java 8 不同类型的 Stream 操作,同时还将了解流的处理顺序,以及不同顺序的流操作是如何影响运行时性能的
    2023-07-07

最新评论