SpringBoot学习历程(二):配置文件详解
前言
- 本人github仓库地址:https://github.com/RabbitsInTheGrass/springBoot-Learning
- springboot提供了外部化配置的功能,可以在不同环境中使用相同的应用程序代码,我们可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。
- 参考官网文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
1. 配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的,一般是
•application.properties 或者 •application.yml。
配置文件的作用:修改SpringBoot自动配置的默认值。
2. 读取配置信息
属性值可以通过:
2.1 @Value注解
用@Value注解直接映射属性值到bean上。
在application.yml 配置如下:
rabbits:
user:
name: 张三
新增一个用户类
package com.rabbits.learn.model;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Description User类
* @Author RabbitsInTheGrass_xj
* @Date 2019-10-02 15:36
*/
@Component
public class User {
@Value("${rabbits.user.name}")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
新增HomeController类
package com.rabbits.learn.controller;
import com.rabbits.learn.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description HomeController类
* @Author RabbitsInTheGrass_xj
* @Date 2019-10-12 15:41
*/
@RestController
public class HomeController {
@Autowired
private User user;
@RequestMapping("/")
String home() {
return user.getName();
}
}
启动服务,访问http://localhost:8080/ 可以看到页面输出张三;
2.2 通过Spring的访问Environment抽象
2.3 @ConfigurationProperties注解
使用 @ConfigurationProperties 注解需要引入配置文件处理器依赖。
<!--引入@ConfigurationProperties注解所需配置文件处理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
上边的栗子就可以改成
@Component
@ConfigurationProperties(prefix = "rabbits.user")
public class User2 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
prefix = “rabbits.user” 和配置文件的属性名一一对应;
@RestController
public class HomeController {
@Autowired
private User user;
@Autowired
private User2 user2;
@RequestMapping("/")
String home() {
return user.getName() + "***" + user2.getName();
}
}
2.4 @PropertySource注解
通过@PropertySource:加载指定的配置文件。
@Configuration
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
2.5 SpringBoot推荐
SpringBoot推荐给容器中添加组件的方式推荐使用全注解的方式:
1、配置类**@Configuration**------>Spring配置文件
2、使用**@Bean**给容器中添加组件
注意:
@Value获取值和@ConfigurationProperties获取值比较如下:
a. @Value是以前spring底层的,使用@Value需要一个一个参数指定,它支持SpEL表达式。
b. @ConfigurationProperties批量注入配置文件中的属性,它支持宽松绑定规则,支持元数据,支持JSR303数据校验和复杂类型封装。
3. 外部配置加载顺序
Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性:
- 主目录上的Devtools全局设置属性(~/.spring-boot-devtools.properties当devtools处于活动状态时)。
- @TestPropertySource 测试中的注释。
- properties测试中的属性。可用于测试应用程序的特定部分@SpringBootTest的测试注释和注释。
- 命令行参数。
- 来自的属性SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的嵌入式JSON)。
- ServletConfig 初始化参数。
- ServletContext 初始化参数。
- java:comp/env的JNDI属性。
- Java系统属性(System.getProperties())。
- 操作系统环境变量。
- RandomValuePropertySource配置的random.*属性值。
- 打包的jar(application-{profile}.properties和YAML变体)之外的特定于配置文件的应用程序属性。
- 打包在jar中的特定于配置文件的应用程序属性(application-{profile}.properties和YAML变体)。
- jar包(application.properties和YAML变体)之外的应用程序属性。
- jar包中的应用程序属性(application.properties和YAML变体)。
- @Configuration类上的注释@PropertySource。
- 默认属性(通过设置指定SpringApplication.setDefaultProperties)。
4. YAML语法:
在*.yml 或者 *.yaml文件中,一般写法是k:(空格)v:表示一对键值对(空格必须有,以空格的缩进来控制层级关系);
- 普通值不需要加双引号(加单引号时会转义特殊字符,这时特殊字符只是一个普通的字符串);
- 对象、Map(键值对)类型:
k: v的方式或者 k: {k1: v1,k2: v2} - 数组(List、Set)类型:
用- 值表示数组中的一个元素 或者 k: [v1,v2,v3]
5. 配置文件中的占位符
5.1 随机数
有时候我们想要参数不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。
com:
test:
string: ${random.value} # 随机字符串
number: ${random.int} # 随机int
longNum: ${random.long} # 随机long
num1: ${random.int(10)} # 10以内的随机数
num2: ${random.int[10,20]} # 10-20的随机数
num3: ${random.uuid} #32位随机数 uuid
5.2 占位符
我们可以用占位符获取之前配置的值,如果没有可以用:指定默认值。例如:
com:
test:
number: ${random.int} # 随机int
num4: ${com.test.number:123}
6. 多环境Profile配置
6.1 application-{profile}.properties/yml
Profile是SpringBoot对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境 。在SpringBoot中多环境配置文件名需要满足application-{profile}.properties/yml的格式,其中{profile}对应你的环境标识,比如:
a. application-dev.yml:开发环境
b. application-test.yml:测试环境
c. application-prod.yml:生产环境
加载哪个具体的配置文件会被,需要在application.properties/yml文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
6.2 激活指定profile
- 在配置文件application.properties/yml中指定 spring.profiles.active=dev
- 命令行: java -jar XXX.jar --spring.profiles.active=dev;
- 虚拟机参数:-Dspring.profiles.active=dev
7. 配置文件加载位置
springboot 启动会扫描以下位置的application.properties/yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
也可以用spring.config.location来改变默认的配置文件位置。
也可以用命令行参数的形式。
8. 常用配置属性大全
太多了。。。。。。。点这个链接springboot配置文件属性大全