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


配置文件的形式

目前,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);

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290179.html

(0)
上一篇 2022年9月29日
下一篇 2022年9月29日

相关推荐

发表回复

登录后才能评论