本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。
1.配置文件的作用
整个项目中所有重要的数据都是在配置文件中配置的,比如∶
- 数据库的连接信息(包含用户名和密码的设置);
- 项目的启动端口;
- 第三方系统的调用秘钥等信息;
- 用于发现和定位问题的普通日志和异常日志,
- 还可以自定义配置,如配置上传文件的保存地址信息等。
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
配置文件分为两类与,一类是系统配置文件,这种配置的格式都是固定的,另外一种是用户自定义配置文件,用户可以随意地规定配置文件的格式。
2.配置文件格式
SpringBoot项目配置文件有两种,一种是出生较早的properties文件,还有另外一种比较新的yml文件。
其实properties文件与yml文件就是一个老实与新式的关系,就像小米6与小米12之间的关系一样,yml文件相比于properties文件做了一些优化,如yml文件天然支持中文字符,而properties文件默认是不支持中文字符的,如果不进行字符配置,输入中文字符就会乱码。
如何配置properties文件默认字符编码呢?过程如下图:
当然,和配置国内源一样,还需要对新建项目设置做出相同的设置。
设置完成,记得把原来的那个配置文件删除,重新新建一个,毕竟已经存在的配置文件格式的编码仍然不是UTF8。
配置文件是存在与resources目录下的,对于SpringBoot项目默认的配置文件,配置文件名必须是application,即application.properties或application.yml文件,如果配置文件名不为application那就不能够被识别。
当application.properties或application.yml两个文件共存是,老式配置文件优先,也就是application.properties生效。
3.配置文件的使用方法
先介绍一个小插件,如果是IDEA专业版可以忽略,对于社区版IDEA来说,默认是没有配置文件的代码提示的,我们安装一个插件来提高我们的开发效率。
这款插件名字叫做spring tools,在IDEA插件安装页面搜索安装就行,毕竟在我之前的文章已经演示很多次如何安装第三方插件了,这里就不细说了。
当然,专业版的IDEA自带,不需要安装额外的插件。
3.1properties配置文件
基本语法:
[C] 纯文本查看 复制代码 # key与=与value之间不要加空格
key=value
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
栗子,设置端口号,我们可以使用规定设置端口号的server.port来设置:
[C] 纯文本查看 复制代码 server.port=8082
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
配置修改完毕后,启动程序,可以看到端口号已经设置成你配置文件所设置的端口号了。
有关更多系统的配置,了解官网的官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
注意!不要在所写的配置信息最后加空格!!!
我们知道配置文件的信息除了系统的配置,还可以自定义配置。
[C] 纯文本查看 复制代码 # 自定义配置信息
custom.name=张三
custom.id=1
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
那如何读取配置文件中的信息呢?读取配置文件中的信息,我们可以使用@Value注解来实现。
我们可以使用属性注入的方式来获取,当然也可以使用构造方法注入和Setter注入,我们以属性注入举例子, 获取规则
[Python] 纯文本查看 复制代码 @Value("${配置信息key}")
private String name;
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
样例:
[Python] 纯文本查看 复制代码 import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UseYml {
@Value("${custom.name}")
private String name;
@Value("${custom.id}")
private String id;
@Value("${server.port}")
private String port;
@ResponseBody
@RequestMapping("/yml")
public String configuration() {
return "name:" + name + "\n"
+ "id:" + id + "\n"
+ "port:" + port;
}
}
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
页面获取结果:
3.2yml配置文件
3.2.1基本语法与使用
基本语法:
[C] 纯文本查看 复制代码 # :后面空格一定不能省
key: value
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
例如,将上述的propertise转换成yml格式如下:
[C] 纯文本查看 复制代码 server:
port: 8082
# 自定义配置信息
custom:
name: zhangsan
id: 1
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
读取yml配置文件的方式与properties配置文件一样,代码都不用变。
yml的优点:
- 语法简单,可读性高。
- 支持更多数据类型。
- 跨语言使用,Python,Go等语言都使用yml。
3.2.2yml中单双引号问题
关于yml单双引号问题:
我们将配置文件中的配置信息设置成如下字样:
[C] 纯文本查看 复制代码 mystring:
str1: 你好\n配置
str2: '你好\n配置'
str3: "你好\n配置"
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
我们将这些配置信息注入到一个类,我们尝试来读取它们。
[Python] 纯文本查看 复制代码 @Controller
public class YmlString {
@Value("${mystring.str1}")
private String str1;
@Value("${mystring.str2}")
private String str2;
@Value("${mystring.str3}")
private String str3;
@ResponseBody
@RequestMapping("/str")
public String mystr() {
System.out.println("str1:" + str1);
System.out.println("str2:" + str2);
System.out.println("str3:" + str3);
return str1 +"\n"
+ str2 + "\n"
+ str3;
}
}
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
控制台输出结果:
这就说明,被双引号包裹的值,按照原语义执行,而被单引号包裹或不包裹的值会发生转义,像上面的例子就是\n转义成了\\n,所以就输出了\n。
3.2.3配置对象
对于yml配置文件,还能进行对象的设置,如设置一个Student对象:
方式1:
[Python] 纯文本查看 复制代码 student:
id: 1
name: 张三
age: 18
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
方式2:
[C] 纯文本查看 复制代码 student: {id: 1,name: 张三,age: 18}
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
从配置文件读取自定义的对象,就不可以使用@Value注解来读取了,需要使用@ConfigurationProperties注解来进行对象的读取,并且对于的类必须有getter/setter方法。
示例:
学生类:
[Python] 纯文本查看 复制代码 import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
private int id;
private String name;
private int age;
}
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
使用类:
[Python] 纯文本查看 复制代码 @Controller
public class ConfigController {
@Resource
private ConfigList configList;
@RequestMapping("/list")
@ResponseBody
public String sayList() {
System.out.println(configList.getName());
return configList.getName().toString();
}
}
SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
运行结果:
小总结:properties与yml的区别
- 语法不同
- properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
- yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
- yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
- yml支持更多的数据类型,如对象和集合。
|