目录
1.配置文件作用
2.配置文件的格式
为配置文件安装提示插件
2.1. .properties(旧版,默认的)
2.1.1.基本语法
PS:配置文件中使用"#"来添加注释信息,2种添加方式:
2.1.2.缺点分析
2.2. .yml(新版)
2.2.1.基本语法
2.2.2.使用进阶
①配置不同数据类型及null
②配置对象
@ConfigurationProperties来读取配置中的对象:
③配置集合
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的。
2.3.properties VS yml
2.4.查看更多系统配置项
3.读取配置文件
3.1.读取properties配置文件:
3.2.读取yml配置文件:
PS:注意:value值加单双引号(yml)
4.扩展:Spring Boot读取配置文件的5种方法
4.1.@Value注解(仅限单个信息,集合和对象除外)
4.2.@ConfigurationProperties注解
4.3.Environment(Spring提供的对象,注入后就能用)
4.4.@PropertySource注解
中文乱码
4.5.原生方式读取(不推荐麻烦)
1.配置文件作用
整个项目中所有重要的数据(会随环境变更的配置信息)都是在配置文件中配置的,如:
- 数据库的连接信息(包含用户名和密码的设置)。
- 项目的启动端口。
- 第三方系统的调用密钥等信息。
- 用于发现定位问题的普通日志和异常日志等。
配置文件中存储的内容有2种:①系统级别的信息;②程序员自定义的信息(特殊业务如保存第三方密钥)。
如果没有配置信息,那么Spring Boot项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志,所以配置信息的作用是非常重要的。
如果没有配置文件,配置信息若写死在源代码中,会存在的问题:
配置项可能写在多个源代码的文件中,会有遗漏的风险。而配置文件让所有的配置信息都统一写在一起,无论查看还是修改都一目了然。
文件保存地址:本地(大概率是Windows系统)和生产服务器(99.9%为Linux系统)二者的目录就完全不一样。MySQL连接的配置文件,本地和远程是不一样的。
Spring Boot一个项目里可以设置2套以上的环境,如:
有一个配置文件专门写在开发环境,还为生产环境再去建一个配置文件。
(这样就不用像之前:上线时配置文件要改为生产环境的配置文件,本地运行时又改为开发环境的配置文件)
只需在进行环境变更的时候,指定一下Spring Boot要用哪个环境的配置文件就行。
(两个文件不存在把哪个注释掉,不用像之前一样添加注释改来改去)
若把所有的配置信息写死在源代码中,是不可改的;而写在配置文件中,是可改的。
.java源代码(可改)编译后生成的target文件夹里是.class字节码文件(改不了);
而配置文件(可改)编译后生成的target文件夹里还是配置文件(可改)。
项目最后运行格式是jar包的格式,jar包里放的是target里的文件,配置文件可以直接从jar包中拉出来,做完修改后再放回压缩包里覆盖原先内容,利于修改。
若是在源代码中写的内容,只能由程序员来进行修改;而配置文件中的内容不仅程序员可改,运维工程师(可改配置文件,懂Linux指令,攻防安全的手段,不会改java源代码)也可修改。在项目上线时,运维决定把服务放在哪台机器上,决定连哪个数据库,他就需要能直接去改配置文件。
2.配置文件的格式
Spring Boot配置文件主要分为以下2种格式(文件的后缀代表文件的格式,配置文件也是如此):
- properties类型的配置文件属于老版本一代产品,也是创建Spring Boot项目时默认的文件格式;而yml属于新版二代产品,若程序员会用且要用,直接创建即可。
- 配置文件的名称是固定的认死的,只能是"application",如果改成其它的名称,配置文件的内容将不再生效。(约定大于配置)
- 配置文件里尽量不要出现中文,会有乱码。yml中可以用中文,因为创建时默认文件格式是UTF-8;properties中千万不要用中文,第二次打开会出现中文变乱码情况,因为创建时文件格式默认是GBK(在未进行系统配置之前)。解决:File里进行重新配置 -> New Project Settings -> Settings for new project -> 搜File Encodings -> 全改为UTF-8(3处)【原来的改不回来,下一次的才会起作用】
- 理论上讲,项目中二者可以并存,当二者并存于一个项目中时,如果2个配置文件中出现了同样的配置,则会以properties中的配置为主,也就是.properties配置文件的优先级最高,但加载完.properties配置文件之后,也会加载.yml文件的配置信息。(约定大于配置)
- 实际业务中,不会混用,会采用一种统一的配置文件格式,这样可以更好地维护(降低故障率)。
为配置文件安装提示插件
IDEA社区版安装Spring Assistant插件之后,就可以正常创建Spring Boot项目了,并且支持yml配置文件的代码提示,但默认不支持properties配置文件的代码提示。(专业版当然天然支持)
此时需要安装Spring Tools插件并重启才会有相应提示。
部分版本IDEA可能没有,尝试使用在线安装地址:Spring Tools在线安装地址https://plugins.jetbrains.com/plugin/14279-spring-tools
也有可能与自己电脑上的IDEA适配不了。
若实在安装不了,就直接用yml吧~
2.1. .properties(旧版,默认的)
2.1.1.基本语法
properties是以键值的形式配置的,key和value之间是以"="连接的。
注:"="的前后不需要加空格,末尾不需要加分号,空格。加多余的任何东西都会报错!
key1=value1
key2=value2
...
PS:配置文件中使用"#"来添加注释信息,2种添加方式:
①选中要添加注释的内容 ctrl + "/";
②在要添加注释的内容前面直接 + "#"。
①系统级别的信息
# 配置项⽬端⼝号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
②程序员自定义的信息(key可以为任意内容,只要不是中文就行)
myconfig.sayhi=hello,config.
2.1.2.缺点分析
配置key有很多冗余信息,也看不出层级关系。要解决此问题,需要用到yml配置文件的格式化。
2.2. .yml(新版)
- yml是YAML的缩写。(Yet Another Markup Language另一种标记语言)
- yml是一个语法简单,可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言(json)类似,并且支持更多的数据类型,可以简单表达清单(数组),对象,散列表,标量等数据形态。不再使用value(只能读取单个的基本数据类型的值)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构,各种配置文件等。
- yml最大的优势是可以跨语言,通用性高,不止是Java中可以使用,golong,高版本的python都可以使用yml作为配置文件。有利于大型企业不同地区(使用语言可能不同)团队合作时程序的互通互联。如果是云服务器开发,可以使用⼀份配置文件作为 Java 和 Go 的共同配置文件。
golong是非常火的谷歌的语言(谷歌目的是创建一种在性能上打败C++,但比C++好用很多的语言),以性能著称,今日头条用的多。
线程是轻量级的进程,Java里并发编程使用的都是多线程;
协程是轻量级的线程,它支持的某些特性是比Java还要灵活些的。golong里有协程,Java里没有。
2.2.1.基本语法
yml是树形结构的配置文件,它的基础语法是"key: value"。
注:key和value之间使用英文冒号加空格的方式组成,其中的空格不可省略!
简单的多级目录写法:
前面有一个tab表示一级目录,没有tab:一级目录;有1个tab:二级目录;有2个tab:三级目录。
key1: #一级key2: #二级key3: value2 #三级key4: value3 #三级
连接数据库配置:(解决了properties的冗余问题)
# 连接数据库配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8username: rootpassword: 12345678driver-class-name: com.mysql.driver
2.2.2.使用进阶
①配置不同数据类型及null
# 字符串
string.value: Hello# 布尔值
boolean.value: true
boolean.value1: false# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法# Null,~代表null
null.value: ~
②配置对象
多行写法:(一个标准对象表达式)
student: # 一级目录是对象的名称id: 1 # 二级目录是这个对象的所有属性name: Java # 二级目录是这个对象的所有属性age: 18 # 二级目录是这个对象的所有属性
行内写法:(更像json的数据格式)(与上面的写法作用一致) (数据比较多时推荐使用)
student: { id: 1,name: Java,age: 18 }
此时就不能用@Value(读取非对象,集合)来读取配置中的对象了,而要用另一个注解:
@ConfigurationProperties来读取配置中的对象:
@ConfigurationProperties(prefix = "对象的名称")
其中的 "prefix = " 可以省略。
多行写法和行内写法读取一样。
student: # 一级目录是对象id: 1 # 二级目录是这个对象的所有属性name: Java # 二级目录是这个对象的所有属性age: 18 # 二级目录是这个对象的所有属性
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;@Data //因为加lombok,所以加上@Data注解就会有get,set方法 @ConfigurationProperties(prefix = "student") //设置key值 @Component //必须要加5大类注解 public class Student {private int id;private String name;private int age; }
import com.example.demo.model.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @RequestMapping("/hi") //路由映射 public class HelloController {@Autowired //注入private Student student;@RequestMapping("/index") //路由映射@ResponseBody //返回一个非静态页面的数据public String sayHi() {System.out.println(student);return "日志详见控制台";} }
③配置集合
配置文件也可以配置list集合。
多行写法:
dbtypes: # 集合的名称name: # 属性- mysql # 属性的值- sqlserver # 属性的值- db2 # 属性的值
行内写法:(与上面的写法作用一致)(数据比较多时推荐使用)
dbtypes: { name: [ mysql,sqlserver,db2 ] }
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的。
@ConfigurationProperties("集合的名称")
dbtypes: { name: [ mysql,sqlserver,db2 ] }
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List;@Component @Data @ConfigurationProperties("dbtypes") //读取dbtypes集合赋值到DBTypes类里的name属性 public class DBTypes { private List<String> name; //此处的属性名要和所读取的集合的属性名保持一致 }
import com.example.demo.model.DBTypes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @RequestMapping("/hi") //路由映射 public class HelloController {@Autowiredprivate DBTypes dbTypes;@RequestMapping("/index") //路由映射@ResponseBody //返回一个非静态页面的数据public String sayHi() {return "dbtypes:" + dbTypes;} }
2.3.properties VS yml
2.4.查看更多系统配置项
想要查看Spring Boot更多系统配置项,访问官网:Spring Boot更多系统配置项https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
3.读取配置文件
在项目中若要主动读取配置文件中的内容,可以使用@Value(仅限单个信息,集合和对象除外)注解来实现。
@Value注解使用"${}"的格式读取。
@Value("${server.port}")
无论是properties还是yml,中间都用"."连接其上下级。(它们的读取系统和自定义配置文件写法一样)
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
@RequestMapping("/hi") //路由映射
public class HelloController {@Value("${server.port}") //表示动态拿一个参数server.portprivate Integer port; //并把它赋值给port@RequestMapping("/index") //路由映射@ResponseBody //返回一个非静态页面的数据public String sayHi() {return "config:" + port;}
}
3.1.读取properties配置文件:
①读取系统配置信息:
②读取自定义配置信息:
3.2.读取yml配置文件:
PS:注意:value值加单双引号(yml)
字符串默认不用加上单引号或双引号,如果加英文的单双引号可以表示特殊含义。
在没有特殊字符时:啥都不加,加单引号,加双引号 -> 效果一样。
在有特殊字符时,如"\n":
# 字符串的定义方法 mystr1: 你好1\n你好1 mystr2: '你好2\n你好2' mystr3: "你好3\n你好3" mystr4: "你好4\\n你好4"
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;@Component public class ReadYml {@Value("${mystr1}")private String str1;@Value("${mystr2}")private String str2;@Value("${mystr3}")private String str3;@Value("${mystr4}")private String str4;@PostConstructpublic void postConstruct() {System.out.println("mystr1:" + str1);System.out.println("mystr2:" + str2);System.out.println("mystr3:" + str3);System.out.println("mystr4:" + str4);} }
@Component在Spring Boot启动时会注入到框架中,注入到框架中时会执行@PostConstruct初始化方法,此时就能读取到配置信息了。
啥都不加:会将字符串中的特殊字符转义,比如将"\n"转换成"\\n"。
加单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。(和啥都不加情况一样)
加双引号:不会转义字符串里的特殊字符,特殊字符会作为本身想表示的意思。"\n"就是换行;若是"\\n",才会将换行符转义为普通字符串。
注:js/yml中单引号中可以是字符串;而java中单引号中是字符(char),双引号中才是字符串(string)。
4.扩展:Spring Boot读取配置文件的5种方法
4.1.@Value注解(仅限单个信息,集合和对象除外)
4.2.@ConfigurationProperties注解
4.3.Environment(Spring提供的对象,注入后就能用)
4.4.@PropertySource注解
中文乱码
如果配置文件中出现中文乱码的情况,可通过指定编码格式的方式来解决中文乱码问题。
@PropertySource(value = "dev.properties", encoding = "utf-8")
//value表示要读取的配置文件的名字
//encoding表示指定编码格式
注:@PropertySource注解默认是支持properties格式配置文件的读取的。
4.5.原生方式读取(不推荐麻烦)
前2种,可以解决读取配置配置文件的 90% 的问题。
其余三种,知道其存在即可。