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

本文主要是介绍Springboot配置文件相关语法及读取方式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方...

配置文件的形式

目前,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}

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

2、数组形式

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

# .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: 招商银行信用卡
    - vhttp://www.chinasem.cnisa: 浦发银行信用卡
    - 建设银行
    - 中国银行
    - 农业银行
    - 工商银行

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个方法,一个是默认以Stpythonring类型读取,一个是指定类型读取
String config0String = env.getProperty("config0String");
int config0Number = env.getProperty("config0Number", Integer.class);
boolean config0Boolean = env.getProperty("config0Boolean", Boolean.编程class);

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Springboot配置文件相关语法及读取方式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156428

相关文章

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Springboot的配置文件及其优先级说明

《Springboot的配置文件及其优先级说明》文章介绍了SpringBoot的配置文件,包括application.properties和application.yml的使用,以及它们的优先级,还讨... 目录配置文件内置配置文件yml与properties的比较优先级比较外置配置文件springboot

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Java利用Spire.XLS for Java自动化设置Excel的文档属性

《Java利用Spire.XLSforJava自动化设置Excel的文档属性》一个专业的Excel文件,其文档属性往往能大大提升文件的可管理性和可检索性,下面我们就来看看Java如何使用Spire... 目录Spire.XLS for Java 库介绍与安装Java 设置内置的 Excel 文档属性Java

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

java中4种API参数传递方式统一说明

《java中4种API参数传递方式统一说明》在Java中,我们可以使用不同的方式来传递参数给方法或函数,:本文主要介绍java中4种API参数传递方式的相关资料,文中通过代码介绍的非常详细,需要的... 目录1. 概述2. 参数传递方式分类2.1 Query Parameters(查询参数)2.2 Path

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin