Spring boot 配置文件读取和yaml结构
Posted xiaoduup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring boot 配置文件读取和yaml结构相关的知识,希望对你有一定的参考价值。
Spring boot 配置文件和ymal结构
文章目录
源码
上一节
yaml
yaml 简介就不多说了,说白了就是类似json结构,比json更清晰的 kv形式的;通俗易懂。
语法
- k: v ; 冒号后面有一个空格
- 使用空格缩进,表示层级关系,尽量不要使用tab
- 大小写敏感
- 驼峰表示, 如:my-name 表示字段myName
- '#'表示注释
ymal 中的数据结构
- string
普通的value即可。 略
- map, object
key, value 形式;
如:
family:
lover: xiaohong
father: xiaoduFather
或者行内表示:
family: “lover”: “xiaohong”,“father”:“xiaoduFather”
- list
使用 - 表示,或者使用逗号分割;
如:
hobby:
- lol
- ping pong
或者行内表示: hobby: lol,ping pong
也可以带上中括号:hobby: [lol,ping pong]
- date
默认格式为 yyyy/MM/dd; 如 birthday: 2010/01/01 12:00:00,或者 2010/01/01
- null
使用 ~ 表示; 如:age: ~
- 更复杂的对象,可以自行查阅,以上平常开发够用了。
示例
#对象
person:
# string
name: xiaodu
# null
age: ~
#date
birthday: 200/01/01 12:00:00
# 集合
hobby: # 行内表示[lol,ping pong]
- lol
- ping pong
# map
family: # 行内表示"lover": "xiaohong","father":"xiaoduFather"
lover: xiaohong
father: xiaoduFather
Sprinsg boot 配置文件
根据profiles 读取不同的配置文件
在resources下我们创建4个配置文件, dev 开发; test 测试, prod 生产;
使用 application-env.yml 形式命名文件名称
application.yml
使用spring.profiles.active 指定配置文件
spring:
profiles:
active: dev
application-dev.yml, application-test.yml, application-prod.yml 分别指定不同的端口;
#dev
server:
port: 8081
#test
server:
port: 8082
#prod
server:
port: 8083
当在application.yml中使用spring.profiles.active指定配置文件后,就会加载相应的配置文件信息;有助于我们根据不同的环境切换信息/
也可以在一个配置文件中进行profile的分区; 使用 三个- 进行分区
#application.yml
spring:
profiles:
active: test1
---
spring:
profiles: dev1
server:
port: 8991
---
spring:
profiles: test1
server:
port: 8992
---
spring:
profiles: prod1
server:
port: 8993
获取配置信息
配置文件信息
person:
name: xiaodu
age: ~
birthday: 200/01/01 12:00:00
hobby: #[lol,ping pong]
- lol
- ping pong
family: #"lover": "xiaohong","father":"xiaoduFather"
lover: xiaohong
father: xiaoduFather
通过注解获取配置文件信息
@value 获取配置信息
使用 $key:default 进行获取配置文件信息; 也可以通过# 使用SPEL 表达式进行表示和运算;冒号面跟默认值
@Value("$person.name:xiaodu")
private String name;
@Value("$person.age")
private Integer age;
// 使用# 进行计算;
// @Value("#'$person.hobby'.split(',')")
private String[] hobbys;
// 还可以使用dateTimeFormat 进行日期的格式化
// @DateTimeFormat(pattern = "yyyy-MM-dd")
@Value("$person.birthday")
private Date birthday;
@ConfigurationProperties获取配置信息
推荐使用此方式
直接通过属性映射给配置类信息;配置类必须被spring管理;也就是一个spring bean;
推荐是使用 @EnableConfigurationProperties(UserProperties.class) 进行; 直接在类上使用@component 也可以。
//prefix 代表前缀
@ConfigurationProperties(prefix = "person")
/*
属性名称相同,直接映射; 大小写,如“ user.my-age 映射 实体属性 myAge
*/
private String name;
// 接收日期;可以指定格式化; 默认 yyyy/MM/dd
// @DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private List<String> hobby;
private Integer age;
// 接收map
private Map<String, String> family;
@PropertySource指定资源位置
@PropertySource 配合@ConfigurationProperties 进行指定配置文件的位置;
@PropertySource 不能使用通配符,只能使用精确的位置;
可以使用 classpath, file, url 对资源进行具体的protocol 指定;也可以通过$ 获取配置信息指定的位置
- classpath
@ConfigurationProperties(prefix = "person1")
@Component
@PropertySource("classpath:user.properties")
- file
@ConfigurationProperties(prefix = "person1")
@Component
@PropertySource("file:/path/to/file.proerties")
- url
@Component
@PropertySource("url:$myConfig.url/config/fruits/price")
@ConfigurationProperties(prefix = "fruits")
url会进行网络请求指定路径获取配置信息;
例如下面模拟了一个接口的返回值,返回的是一个 properties 文件格式的字符串。
通过url指定该路径。
@RestController
@RequestMapping("/config")
public class PropertiesController
@GetMapping("/fruits/price")
public String fruitsPrice()
return "fruits.apple=1.2/kg\\nfruits.banana=1.5/kg";
默认@PropertySource 指定资源位置后,使用properties 后缀的文件信息,若想使用则需要配置yaml解析
使用@propertySource 配置使用yaml
指定yamlpropertysource 的解析; DefaultPropertySourceFactory 是springboot 提供的默认的,只支持kv形式的properties文件格式
- 自定义 yamlPropertySourceFactory
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException
String filename = resource.getResource().getFilename();
String sourceName = Optional.ofNullable(name).orElse(resource.getResource().getFilename());
if (!resource.getResource().exists())
return new PropertiesPropertySource(sourceName, new Properties());
if (filename.endsWith(".yaml") || filename.endsWith(".yml"))
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = yamlPropertiesFactoryBean(resource);
return new PropertiesPropertySource(sourceName, yamlPropertiesFactoryBean.getObject());
return super.createPropertySource(name, resource);
public YamlPropertiesFactoryBean yamlPropertiesFactoryBean(EncodedResource encodedResource)
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(encodedResource.getResource());
yamlPropertiesFactoryBean.afterPropertiesSet();
return yamlPropertiesFactoryBean;
- @PropertySource 中指定 factory
@ConfigurationProperties(prefix = "person2")
@Component
@PropertySource(value = "classpath:user.yaml", factory = YamlPropertySourceFactory.class)
下一节
以上是关于Spring boot 配置文件读取和yaml结构的主要内容,如果未能解决你的问题,请参考以下文章