SpringBoot回顾2-配置文件全解析
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
核心配置文件
可以看到我们SpringBoot项目里默认生成的是applicaiton.properties
但其实配置文件还有.yml和.yaml格式的,在SpringBoot中都是支持的,怎么读?跟我读,压妹儿
其实配置方式都一样,主要是配置文件的书写格式存在很大的差异,下面结合之前接触的properties和新接触的yml/yaml(两者基本没有区别,怎么使用取决于你的喜好)
.properties文件(默认采用)
这个文件我们应该是很熟悉了,在之前的Spring里已经接触过,书写格式如下
#设置内嵌Tomcat端口号
server.port=80
#设置上下文根(必须以"/"开始)
server.servlet.context-path=/springboot
.yml/.yaml文件
YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
但是yaml的语法要求十分严格,有python那味儿了,缩进空格拿捏得死死的。
比如上面在properties里的配置,我们在yaml里实现如下
#springboot内嵌tomcat的端口号,和根目录
server:
port: 8080
servlet:
context-path: /
红色框圈起来的地方都有空格,不能省略,而且用缩进来控制层级关系,可以看到server下有port和servlet两类,servlet下又有context-path,都是由缩进来控制的,一目了然的是,左边对齐的数据都是一个层级的
如果存在多个配置文件,优先使用application.properties
但是yaml文件的功能远不与此,不然为什么要引入一个新的格式的配置文件呢?他最厉害的地方是可以给实体类注入匹配值。
yaml注入配置文件
在controller文件夹同级下创建dao层,我们新建一个实体类Dog
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component //注册bean到容器中
public class Dog {
private String name;
private Integer age;
//别问我get、set方法呢,lombok老偷懒哥了
}
传统注入值的方法,@Value
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
@Value("阿黄")
private String name;
@Value("18")
private Integer age;
}
在SpringBoot的测试类内输出康康
@SpringBootTest
class Helloworld1sbApplicationTests {
@Autowired //把对象装配进来
Dog dog;
@Test
void contextLoads() {
System.out.println(dog); //打印康康dog对象值的注入
}
}
可以看到注入成功
接下来用yaml文件注入测试一下
我们把刚才@Value注入注释掉,或者删掉
在application.yaml里加入数据
#springboot内嵌tomcat的端口号,和根目录
server:
port: 8080
servlet:
context-path: /
dog:
name: 阿黄压妹儿
age: 19
在实体类中绑定配置文件中的数据
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix="dog")
public class Dog {
//@Value("阿黄")
private String name;
//@Value("18")
private Integer age;
}
从配置文件中获取值,赋值给对象的属性,第一次这里会报错,我们打开文档后发现需要添加一个导出配置文件处理器的依赖
在pom.xml中加入
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
不报错后依旧测试SpringBootTest测试类,可以看到注册成功
我们可以加载指定的配置文件
加载指定的配置文件
**@PropertySource :**加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
1、我们去在resources目录下新建一个dogData.properties文件
name=指定阿黄
age=20
2、在代码中指定加载dogData.properties文件
package com.feng.helloworld1sb.dao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* <h3>helloworld1sb</h3>
* <p></p>
*
* @author : Nicer_feng
* @date : 2020-10-06 10:33
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@PropertySource(value = "classpath:dogData.properties")
public class Dog {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
}
老地方测试
咦,乱码啦,可以发现properties注入数据的时候存在中文问题,如何解决呢?
properties中文乱码设置
找到Setting--->Editor--->File Encodings
以防万一,我们还可以在实体类的PropertySource注解中加入指定格式
@PropertySource(value = "classpath:dogData.properties", encoding = "utf-8")
运行,完事儿
小结
我们可以看到以前用的@Value很局限,而@ConfigurationProperties的用法更加广泛,只需要在实体类上写一次,@Value要在每一个属性上写。所以在配置yaml和properties都可以获取到值时,强烈推荐用yaml,如果只是拿个别属性的值,大可用@Value,如果专门写了一个Javabean来和配置文件映射,那就直接上@ConfigurationProperties吧