ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-09-29 14:47:12  阅读:45  来源: 互联网

标签:


配置文件的形式

目前,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形式

它支持字符串类型(支持转义字符,比如 同样会换行,本质就是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、数组形式

它支持字符串类型(支持转义字符,比如 同样会换行,本质就是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);

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

标签:
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有