1 目标
本节咱们要解决如下几个问题:
- 如何应用Spring Boot读取配置文件?有哪些形式?
- 罕用的几种数据结构,如字符串、整数、List、Map,如何配置?如何读取?
- 如何自定义配置文件的门路?
2 读配置文件
Spring Boot默认的配置文件有两种格局: application.properties
和 application.yml
。
查找程序是首先从application.properties
查找,如果找不到,再查找 application.yml
。
优先级:application.properties > application.yml
。
2.1 应用 @Value 读取配置
配置如下:
erwin.name=冯文议erwin.age=20erwin.sex=男erwin.english-name=Erwin Fengerwin.birthday=1992/02/26erwin.like=movie,game,music,tea,travelerwin.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京erwin.moreOther={myWeb:'https://fengwenyi.com',github:'https://github.com/fengwenyi'}
代码如下:
package com.fengwenyi.spring_boot_config_sample.config;import lombok.Data;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import java.util.*;/** * @author Erwin Feng * @since 2020/8/11 */@Data@Configurationpublic class ReadConfigByValue { @Value("${erwin.name}") private String name; @Value("${erwin.age}") private Integer age; @Value("${erwin.sex}") private String sex; @Value("${erwin.english-name}") private String englishName; @Value("${erwin.birthday}") private Date birthday; @Value("${erwin.like}") private List<String> likes; @Value("#{'${erwin.visitedCities}'.split(',')}") private List<String> visitedCities; @Value("#{${erwin.moreOther}}") private Map<String, String> moreOther; }
2.2 应用 @ConfigurationProperties 读取配置
配置如下(properties格局)
author.name=冯文议author.age=20author.sex=男author.english-name=Erwin Fengauthor.birthday=1992/02/26author.like[0]=movieauthor.like[1]=gameauthor.like[2]=musicauthor.like[3]=teaauthor.like[4]=travelauthor.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京author.moreOther.myWeb=https://fengwenyi.comauthor.moreOther.github=https://github.com/fengwenyi
配置如下(yaml格局)
author: name: 冯文议-yml age: 20 sex: 男 english-name: Erwin Feng birthday: 1992/02/26 like: - movie - game - music - tea - travel visitedCities: 巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京 moreOther: myWeb: https://fengwenyi.com github: https://github.com/fengwenyi
代码如下:
package com.fengwenyi.spring_boot_config_sample.config;import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import java.io.Serializable;import java.util.Date;import java.util.List;import java.util.Map;/** * @author Erwin Feng * @since 2020/8/12 */@Data@Configuration@ConfigurationProperties(prefix = "author")public class AuthorConfig implements Serializable { private static final long serialVersionUID = 9032405467573421607L; private String name; private Integer age; private String sex; private String englishName; @JsonFormat(pattern = "yyyy/MM/dd") private Date birthday; private List<String> like; private List<String> visitedCities; private Map<String, String> moreOther;}
读取进去的数据展现:
{ "name":"冯文议", "age":20, "englishName":"Erwin Feng", "birthday":"1992/02/26", "likes":[ "movie", "game", "music", "tea", "travel" ], "visitedCities":[ "巴中", "揭阳", "广州", "从化", "成都", "三亚", "上海", "杭州", "北京" ], "moreOther":{ "myWeb":"https://fengwenyi.com", "github":"https://github.com/fengwenyi" }}
2.3 通过注入环境变量来获取配置信息
@Autowired private Environment environment;
3 @Value 用法
3.1 设置默认值
格局:@Value("${name:defaultValue}")
当配置文件找不到这个配置时,就会返回默认值,如果没有默认值,就会报错。
3.2 能够间接读取零碎的属性值
如:@Value("${java.home}")
D:JavaJava8jdk1.8.0_251jre
3.3 能够用在办法和参数上,当做单元测试
// 单元测试-读取配置文件的值 @Value("${erwin.like}") public void testReadLike(String like, @Value("${erwin.sex}") String sex) { System.out.println("1===>" + like); System.out.println("1===>" + sex); }
参数 like 会取 @Value("${erwin.like}") 的值 参数 sex 会取 @Value("${erwin.sex}") 的值 通过测试,多个办法,执行程序是随机。 特地留神:这个只是在启动的时候执行,然而理论调用的时候,还是传入的值。
3.4 读取list的值
办法一:
配置文件:
erwin.like=movie,game,music,tea,travel
Java代码:
@Value("${erwin.like}") private List<String> likes;
办法二:
erwin.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京
Java代码:
@Value("#{'${erwin.visitedCities}'.split(',')}") private List<String> visitedCities;
3.5 读取Map的值
配置文件:
erwin.moreOther={myWeb:'https://fengwenyi.com',github:'https://github.com/fengwenyi'}
Java代码:
@Value("#{${erwin.moreOther}}") private Map<String, String> moreOther;
3.6 读取零碎属性
@Value("#{systemProperties}") private Map<String, String> systemPropertiesMap;
3.7 给公有属性赋值
@Component@PropertySource("classpath:values.properties")public class PriorityProvider { private String priority; @Autowired public PriorityProvider(@Value("${priority:normal}") String priority) { this.priority = priority; } // standard getter}
4 @ConfigurationProperties
package com.fengwenyi.spring_boot_config_sample.config;import com.fengwenyi.spring_boot_config_sample.support.YamlPropertySourceFactory;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import java.io.Serializable;/** * @author Erwin Feng * @since 2020/8/13 */@Data@Configuration@ConfigurationProperties(prefix = "db")//@PropertySource({"classpath:config/db.properties"})@PropertySource(value = {"classpath:config/db.yml"}, factory = YamlPropertySourceFactory.class)public class DBConfig implements Serializable { private static final long serialVersionUID = -6527591545525817929L; /** 服务器地址 */ private String host; /** 端口 */ private Integer port; /** 数据库名 */ private String dbName; /** 用户名 */ private String username; /** 明码 */ private String password;}
配置文件:
db: host: localhost port: 3306 db-name: test username: root password: 123456
阐明: 1、@Configuration 表明这是一个Spring配置,会注入到Spring容器中。 2、@ConfigurationProperties(prefix = "db") 示意这个类与配置文件关联,其中prefix指明前缀。 3、@PropertySource 这个指明配置文件的地位,如果没有这个配置,则会从默认的配置文件读取。默认的配置文件:application.properties > application.yml。另外,这个默认只反对properties类型的文件,所以,须要配置factory。 4、@PropertySource也能够与@Value联合应用。
参考链接
- @Value用法:https://www.baeldung.com/spring-value-annotation
- 自定义配置 只读properties 不读 yml文件:https://blog.csdn.net/WTUDAN/article/details/103313167
- Spring配置文件user.name配置有效:https://blog.csdn.net/u013536829/article/details/80027391