Spring Boot第二弹,配置文件怎么造?
持续原创输出,点击上方蓝字关注我吧

前言
自从用了Spring Boot,个人最喜欢的就是Spring Boot的配置文件了,和Spring比起,Spring Boot更加灵活,修改的某些配置也是更加得心应手。
Spring Boot 官方提供了两种常用的配置文件格式,分别是properties、YML格式。相比于properties来说,YML更加年轻,层级也是更加分明。
今天这篇文章就来介绍一下Spring Boot的配置文件的语法以及如何从配置文件中取值。
properties格式简介
常见的一种配置文件格式,Spring中也是用这种格式,语法结构很简单,结构为:key=value。具体如下:
userinfo.name=myjszl
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2
上述配置文件中对应的实体类如下:
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
结构很简单,无非就是key=value这种形式,也是在开发中用的比较多的一种格式。
YML格式简介
以空格的缩进程度来控制层级关系。空格的个数并不重要,只要左边空格对齐则视为同一个层级。注意不能用tab代替空格。且大小写敏感。支持字面值,对象,数组三种数据结构,也支持复合结构。
字面值:字符串,布尔类型,数值,日期。字符串默认不加引号,单引号会转义特殊字符。日期格式支持yyyy/MM/dd HH:mm:ss
对象:由键值对组成,形如 key:(空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致,也可以使用行内写法:{k1: v1, ....kn: vn}
数组:由形如 -(空格)value 的数据组成。短横线后面的空格是必须要有的,每组数据占用一行,且缩进的程度要一致,也可以使用行内写法:[1,2,...n]
复合结构:上面三种数据结构任意组合
如何使用
在src/resources文件夹下创建一个application.yml文件。支持的类型主要有字符串,带特殊字符的字符串,布尔类型,数值,集合,行内集合,行内对象,集合对象这几种常用的数据格式。
具体的示例如下:
userinfo:
age: 25
name: myjszl
active: true
created-date: 2018/03/31 16:54:30
map: {k1: v1,k2: v2}
hobbies:
- one
- two
- three
上述配置文件对应的实体类如下:
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
总结
YML是一种新式的格式,层级鲜明,个人比较喜欢使用的一种格式,注意如下:
字符串可以不加引号,若加双引号则输出特殊字符,若不加或加单引号则转义特殊字符 数组类型,短横线后面要有空格;对象类型,冒号后面要有空格 YAML是以空格缩进的程度来控制层级关系,但不能用tab键代替空格,大小写敏感
如何从配置文件取值?
一切的配置都是为了取值,Spring Boot也是提供了几种取值的方式,下面一一介绍。
@ConfigurationProperties
这个注解用于从配置文件中取值,支持复杂的数据类型,但是不支持SPEL表达式。
该注解中有一个属性prefix,用于指定获配置的前缀,毕竟配置文件中的属性很多,也有很多重名的,必须用一个前缀来区分下。
该注解可以标注在类上也可以标注在方法上,这也注定了它有两种获取值的方式。
1. 标注在实体类上
这种方式用于从实体类上取值,并且赋值到对应的属性。使用如下:
/**
* @Component :注入到IOC容器中
* @ConfigurationProperties:从配置文件中读取文件
*/
@Component
@ConfigurationProperties(prefix = "userinfo")
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
标注在配置类中的方法上
标注在配置类上的方法上,同样是从配置文件中取值赋值到返回值的属性中。使用如下:
/**
* @Bean : 将返回的结果注入到IOC容器中
* @ConfigurationProperties :从配置文件中取值
* @return
*/
@ConfigurationProperties(prefix = "userinfo")
@Bean
public UserInfo userInfo(){
return new UserInfo();
}
总结
@ConfigurationProperties注解能够很轻松的从配置文件中取值,优点如下:
支持批量的注入属性,只需要指定一个前缀 prefix支持复杂的数据类型,比如 List、Map对属性名匹配的要求较低,比如 user-name,user_name,userName,USER_NAME都可以取值支持JAVA的JSR303数据校验
注意:@ConfigurationProperties这个注解仅仅是支持从Spring Boot的默认配置文件中取值,比如application.properties、application.yml。
@Value
@Value这个注解估计很熟悉了,Spring中从属性取值的注解,支持SPEL表达式,不支持复杂的数据类型,比如List。使用如下:
@Value("${userinfo.name}")
private String UserName;
如何从自定义配置文件中取值?
Spring Boot在启动的时候会自动加载application.xxx和bootsrap.xxx,但是为了区分,有时候需要自定义一个配置文件,那么如何从自定义的配置文件中取值呢?此时就需要配合@PropertySource这个注解使用了。
只需要在配置类上标注@PropertySource并指定你自定义的配置文件即可完成。如下:
@SpringBootApplication
@PropertySource(value = {"classpath:custom.properties"})
public class DemoApplication {
value属性是一个数组,可以指定多个配置文件同时引入。
@PropertySource默认加载xxx.properties类型的配置文件,不能加载YML格式的配置文件,怎么破???
如何加载自定义YML格式的配置文件?
@PropertySource注解有一个属性factory,默认值是PropertySourceFactory.class,这个就是用来加载properties格式的配置文件,我们可以自定义一个用来加载YML格式的配置文件,如下:
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.Properties;
public class YmlConfigFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
String sourceName = name != null ? name : resource.getResource().getFilename();
if (!resource.getResource().exists()) {
return new PropertiesPropertySource(sourceName, new Properties());
} else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {
Properties propertiesFromYaml = loadYml(resource);
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
} else {
return super.createPropertySource(name, resource);
}
}
private Properties loadYml(EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}
}
此时只需要将factory属性指定为YmlConfigFactory即可,如下:
@SpringBootApplication
@PropertySource(value = {"classpath:custom.yml"},factory = YmlConfigFactory.class)
public class DemoApplication {
总结
@PropertySource指定加载自定义的配置文件,默认只能加载properties格式,但是可以指定factory属性来加载YML格式的配置文件。
总结
以上内容介绍了Spring Boot中的配置文件的语法以及如何从配置文件中取值,这个内容很重要,作者也是尽可能讲的通俗易懂,希望读者能够有所收获。
Spring Boot第二弹,配置文件怎么造?的更多相关文章
- 如何使用VS Code编写Spring Boot (第二弹)
本篇文章是续<如何使用VS Code编写Spring Boot> 之后,结合自己.net经验捣鼓的小demo,一个简单的CRUD,对于习惯了VS操作模式的.net人员非常方便,强大的智能提 ...
- spring boot 项目从配置文件中读取maven 的pom.xml 文件标签的内容。
需求: 将pom.xml 文件中的版本号读取到配置文件并打印到日志中. 第一步: 在pom.xml 中添加以下标签. 第二步: 将version 标签的值读取到配置文件中 这里使用 @@ 而不是 ...
- Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件.application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置.b ...
- Spring Boot 第一弹,问候一下世界!!!
持续原创输出,点击上方蓝字关注我吧 目录 前言 什么是Spring Boot? 如何搭建一个Spring Boot项目? 第一个程序 Hello World 依赖解读 什么是配置文件? 什么是启动类? ...
- Spring Boot的properties配置文件读取
我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点Spring Boot读取配置文件的代码出来,当然只是读配置文件没必要这么麻烦,不过反正闲着也是闲着,扣着玩了.具体启动过程以前的博客写 ...
- 【转】spring boot mybatis 读取配置文件
spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...
- Spring Boot加载配置文件
问题1:Spring如何加载配置,配置文件位置? 1.默认位置: Spring Boot默认的配置文件名称为application.properties,SpringApplication将从以下位置 ...
- Spring Boot 2 读取配置文件
开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 新建一个名称为demo的Spring Boot项目. 一.默认配置文件 Spring Boot会读取名称a ...
- Spring Boot 获取yaml配置文件信息
Spring boot 项目启动过程中: org.springframework.boot.SpringApplication#prepareEnvironment 当程序步入listeners.en ...
随机推荐
- 牛客网PAT练兵场-跟奥巴马一起编程
题目地址: 题意:无 /** * *作者:Ycute *时间:2019-11-14-21.29.07 *题目题意简单描述:模拟题输出 */ #include<iostream> #incl ...
- 【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- Kafka入门(3):Sarama生产者是如何工作的
摘要 在这一篇的文章中,我将从Sarama的同步生产者和异步生产者怎么创建开始讲起,然后我将向你介绍生产者中的各个参数是什么,怎么使用. 然后我将从创建生产者的代码开始,按照代码的调用流程慢慢深入,直 ...
- 4300 字Python列表使用总结,用心!
今天列表专题的目录如下: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这 ...
- 你懂RocketMQ 的架构原理吗?
前言 前面我们跟大家聊了聊什么是消息中间件,以及哪些场景使用哪些消息中间件更加合适. 我们了解到RocketMQ是java语言开发的,我们能更深入的阅读源码了解它的底层原理,而且它具有优秀的消息中间件 ...
- Apache Pulsar 社区周报:08-15 ~ 08-21
关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...
- 热更新 && 增量更新
Unity中SLua.Tolua.XLua和ILRuntime效率评测 http://blog.csdn.net/u011467512/article/details/72716376 如何阅读lua ...
- vue学习笔记一
vue 颠覆式的开发方式 解疑 为什么要学习vue? 降低项目的复杂度 就业需要 vue难不难? 特别简单 相比于React,vue有什么优势? 前端三大框架:Angular.React.Vue Vu ...
- Stack (30)(模拟栈,输出中间数用set)
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- C# 压缩源文件(导出源文件word文件)
说明 1 : 在webUI 公共类,存放 ZipHelper 类 说明 2 :判断文件路径是否存在,不存在则创建文件夹 说明 3 : 引用类方法,判断压缩文件,返回的,是true/false 引用 ...