文章目录
配置文件的作用就是
保存项目中的所有重要的数据信息以及一些通用配置
比如启动一个项目,默认情况下 Tomcat 会占用 8080 端口,但是有些时候会因为 8080 端口已经被占用了,导致启动项目失败,解决办法要么是先查到占用端口的进程,然后从任务管理器中关闭进程,要么就是就重新设置端口号,然而一般的重置端口号的过程并不方便。
但是在配置文件中只要写一句 server.port=XXXX,启动项目,就可以发现端口号已经被改成 XXXX ,方便的很
还有
数据库的连接信息
、
第三方系统的调用密钥
等信息、
日志信息的配置
等等
Spring Boot 常用的配置文件的格式有两种:
.properties
.yml
这两种配置文件的格式是可以同时存在于一个项目中的,如果两配置文件中有同样的配置(比如都配置端口信息),此时会以
.properties 格式
配置的端口为主,其
优先级会更高
加载完 .properties 文件后,就会加载 .yml 文件
一个项目中可以存在很多 properties 文件(yml 文件),名字可以随便起,但是 Spring Boot 项目启动时,只会自动加载名字为
application
的配置文件
实际业务中,一般会统一使用其中一种配置文件的格式,可以降低故障率
官网:查看更多系统配置项
一、properties 文件
在学习 .properties 文件之前,需要先装一个插件
Spring Tools
,yml 文件中是有代码提示的但是 properties 文件没有(指的是社区版),安装了该插件后,就会有相应的代码提示
1.1 properties 基本语法
properties 是以键值对的形式配置的,key 和 value 之间只要
"="
连接
key=value
注意:等号
两边不要出现空格
,value
后面也不要出现空格
# 端口号设置
server.port=9090
# 数据库连接信息设置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/OJSystem
spring.datasource.username=root
spring.datasource.password=1111
1.2 读取配置文件
在项目中读取配置文件中的内容,可以通过
@Value
注解
该注解需要使用
"${}"
的格式进行读取
代码展示
@Controller@ResponseBody@RequestMapping("/index")publicclassUController{@Value("${server.port}")privateInteger port;@RequestMapping("/port")publicStringfunc(){return"port:"+ port;}}
注意
@Value 注解中的内容如果用双引号直接包含起来,表示设置一个具体的 value 值而不是配置文件中的 key ;
只有加上 ${} 才会读取到配置信息中的 key 值(server.port),将 key 值对应的 value 值(9090)赋值给 port 变量;
结果展示
1.3 properties 缺点
在上面配置数据库的信息时,会发现有很多的
代码冗余
,每条配置信息前都有 spring.datasource ,可读性是比较差的
二、.yml 文件
yml 文件就很好的解决了 properties 文件的缺点,可读性高,也易于理解,还可以表达数组、对象等数据形态,而且还跨语言,除了 Java,golang、python 都可以使用该类型的配置文件
2.1 yml 基本语法
yml 是树形结构的配置文件
key: value
注意:key 和 value 之间有一个英文的冒号
":"
和一个
空格
,两者缺一不可
# 端口号设置server:port:9191# 数据库连接信息设置spring:datasource:url: jdbc:mysql://127.0.0.1:3306/OJSystem
username: root
password:1111
通过例子,可以发现 yml 文件可以很好解决 properties 文件的代码冗余问题
通过
空格缩进程度来控制层级关系
,如果为同级属性,缩进应当要一样
2.2 yml 的运用
yml 支持字面值、对象、数组等数据结构,也支持它们的复合结构
2.2.1 字面值
包括字符串、布尔类型、整形(包括各种进制)、浮点型(包括科学计数法)、null等
配置信息
# 字符串类型String: yml配置文件
# 整形myInt:666# nullmyNull:value:~# 浮点型myDouble.value:1.23
yml 文件中读取配置信息也可以使用 @Value 注解,同 properties 用法相同
代码展示
@Controller@ResponseBody@RequestMapping("/index")publicclassUController{@Value("${String}")privateString myString;@Value("${myInt}")privateInteger myInt;@Value("${myDouble.value}")privateDouble myDouble;@Value("${myNull.value}")privateObject myNull;@RequestMapping("value")publicStringfunc1(){String res ="String: "+ myString
+"----"+"myInt: "+ myInt
+"----"+"myNull.value: "+ myNull
+"----"+"myDouble.value: "+ myDouble;return res;}}
结果展示
注意:yml 中的 null 不是指值为 null ,而是指什么都没有的意思,因此打印出来内容是空的
关于字符的特殊说明
在 yml 中如果字符串使用了
双引号
进行包裹,那么写了特殊字符是
不会进行转义
的,就会按照特殊字符的方式进行处理,比如 \n 就会被当成换行符进行处理
如果字符串添加的是
单引号
或者
什么都没有
添加,就会将特殊字符
进行转义
,输入的是什么输出的就是什么,特殊字符最终只是一个普通的字符串数据
配置文件
myString:value1: Hello \n world
value2:'Hello \n world'value3:"Hello \n world"
代码展示
@Value("${myString.value1}")privateString myString1;@Value("${myString.value2}")privateString myString2;@Value("${myString.value3}")privateString myString3;@RequestMapping("/myString")publicvoidfunc2(){System.out.println("value1: "+ myString1);System.out.println("value2: "+ myString2);System.out.println("value3: "+ myString3);}
结果显示
2.2.2 对象
yml 中可以配置对象,这是 properties 文件中所没有的
配置文件
# 方式一article:id:1name: 人与自然
content: 内容简介
# 方式二article1:{id:2,name: Java发展史,content: 对Java的简介 }
注意:无论方式一还是方式二都需要在 key 和 value 间加上英文冒号以及一个空格,方式二创建对象的方式适合于属性较少时,方式一在属性较多时会更加的直观
代码展示
想要获取到配置文件中对象的信息,可以通过之前的 @Value 注解的方式,但是这样的话,对象有多少个属性,就会需要写多少个 @Value ,会非常的麻烦
所以,可以通过其他方式将对象中的内容一下子读取到某个类中,然后通过注入的方式获取到类中的信息
首先,创建一个 Article 类
通过
@ConfigurationProperties
注解来指定 Spring Boot 启动时需要将配置文件中的哪个对象赋值到该类上,其中 prefix = 可以省略
需要注意的是
一定要提供 get/set 方法
,尤其是 set 方法,如果不提供,项目启动后没有办法将配置文件中对应对象的属性赋值进来,就会报错。不提供 get 方法虽然不会报错,但是没有办法通过方法获取对象的某个属性了
属性名需要与配置文件中的属性名一一对应
,否则获取的时候就会找不到对应的属性名,结果为默认值
@Component@ConfigurationProperties(prefix ="article")publicclassArticle{privateint id;privateString name;privateString content;publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetContent(){return content;}publicvoidsetContent(String content){this.content = content;}@OverridepublicStringtoString(){return"Article{"+"id="+ id +", name='"+ name +'\''+", content='"+ content +'\''+'}';}}
然后,进行
依赖的注入
需要使用 @Autowired 注解或者 @Resource 注解将 Article 类注入到依赖它的类中,这里使用的前者注解。注入方法这里使用的是属性注入
@Controller@ResponseBodypublicclassArticleController{@AutowiredprivateArticle article;@RequestMapping("/article")publicvoidfunc(){System.out.println(article);}}
结果展示
2.2.3 数组
配置文件
# 方法一book-list:books:- Java书
- Python书
- C++书
# 方法二booklist1:{books:[人与自然,美人鱼]}
在
":"
和
"-"
后面都需要
添加空格
拿方法一的案例来说,就相当于说有一个 Key 值为 book-list,key 值下面有一个 books 属性,该属性里面存储了三个信息:Java书、Python书、C++书
需要注意的是方法一中的命名方式,由于 SpringBoot 2.X 版本对配置文件中的命名规范有强制性的要求,不允许使用驼峰形式(比如bookList),需要按照提示说的那样使用 - 代替
代码显示
首先,创建一个 BookList 类
同样可以通过
@ConfigurationProperties
注解来指定 Spring Boot 启动时需要将配置文件中的哪个对象赋值到该类上
属性名 books 需要和配置文件中 key 为 book-list 的 value 中的属性名相对应
同样也需要
提供 get/set 方法
,这里使用了
@Data
注解。该注解来源于创建项目时引入的
lombok 依赖
,加上该注解,就可以提供 get/set 方法、 toString 方法…
@Component@ConfigurationProperties(prefix ="book-list")@DatapublicclassBooKList{privateList<String> books;}
然后,进行依赖的注入
@Controller@ResponseBodypublicclassListController{@AutowiredprivateBooKList booKList;@RequestMapping("/list")publicvoidgetBooks(){System.out.println(booKList.getBooks());}}
结果显示
三、properties 和 yml 区别总结
- 语法格式- properties :以 key=value 的键值对形式配置的配置文件,其中 key 是以 “.” 进行分割的- yml :使用类似 json 格式的树形配置方式进行配置,使用缩进来控制层级关系,key 和 value 之间使用冒号和一个空格隔开,皆不可省略
- 冗余问题- properties :是一种默认的,早期的配置文件格式,配置存在数据的冗余- yml :很好的解决了数据冗余现象,可读性更高,写法更简洁明了
- 通用性- properties :只是作为 Java 语言的配置文件- yml :通用性更好,支持多种语言,Java、Go、Python…,比如做云计算使用 Go 和 Java 的时候,可以通过配置中心使用同一份配置
- 数据类型- properties :只支持键值对数据- yml :支持列表,对象,标量等等数据类型
完~~~
版权归原作者 富春山居_ZYY 所有, 如有侵权,请联系我们删除。