配置文件的形式
目前,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