Spring Boot的配置文件
Spring Boot 使用一个全局配置文件,放置在 src/main/resources 目录或类路径的 /config 下;名称为application.properties 或 application.yml;用于修改 Spring Boot 自动配置的默认值。
YAML语法格式
yml 是 YAML(YAML Ain’t Markup Language)语言,不是一个标记语言;以前的配置文件;大多都使用的是 xxxxx.xml文件;YAML语言,以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;
YAML基本语法
- key: value 表示一对键值对(冒号后面必须要有空格)
- 使用空格缩进表示层级关系
- 左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
- key 与 value 大小写敏感
server:
port: 8081
contextPath: /demo
YMAL常用写法
- 字面量
包括数值,字符串,布尔,日期,等;字符串默认不用加上引号;使用 “双引号” 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出,如 name: “mengxuegu \n jiaoyu” 将输出: mengxuegu 换行 jiaoyu;使用 ‘单引号’ 会转义特殊字符,特殊字符当作一个普通的字符串输出,name: 'mengxuegu \n jiaoyu 输出: mengxuegu \n jiaoyu。 - 对象 & Map
key: value,value存储对象,每个值换一行写,注意值要左对齐
demo:
map:
name: 张三
age: 18
location: 北京
- 行内写法:
demo:
map: {name:张三,age:18,location:北京}
- 数组(List、Set)
用-
值表示数组中的一个元素,写法为:
demo:
list:
- java
- php
- python
行内写法:
demo:
list: [java,php,python]
yaml 配置文件注入值
1. 编写 JavaBean:
/**
* @ConfigurationProperties 告诉SpringBoot将配置文件中对应属性的值,映射到这个组件类中,进行一一绑定
* prefix = "emp":配置文件中的前缀名,哪个前缀与下面的所有属性进行一一映射
* @Component 必须将当前组件作为SpringBoot中的一个组件,才能使用容器提供的 @ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "demo.user")
public class UserProperties {
private String name;
private Integer age;
private String location;
private Date birthday;
private List list;
private Map map;
------- get\set------
}
2. 编写 application.yml 配置文件
demo:
user:
name: admin
age: 18
location: 北京
birthday: 1992-05-22
list:
- 1
- 2
- 3
map: {k1: v1, k2: v2}
3. 使用 SpringBoot 单元测试类进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootApplicationTests {
@Autowired
private UserProperties userProperties;
@Test
void contextLoads() {
System.out.println(userProperties.getName());
System.out.println(userProperties.getAge());
System.out.println(userProperties.getLocation());
System.out.println(userProperties.getBirthday());
System.out.println(userProperties.getList());
System.out.println(userProperties.getMap());
}
}
- 解决提示处理器没有发现
解决:
在 pom.xml 导入配置文件处理器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
properties 配置文件注入值
application.properties 配置文件
demo.user.name = 张三
demo.user.age = 18
demo.user.birthday = 1990/01/01
demo.user.localtion = 北京
demo.user.list = 1,2,3
demo.user.map.K1 = v1
demo.user.map.K2 = v2
使用@Value获取值
@Component
public class UserProperties {
@Value("${demo.user.name}")
private String name;
@Value("${demo.user.age}")
private Integer age;
@Value("${demo.user.location}")
private String location;
@Value("${demo.user.birthday}")
private Date birthday;
@Value("${demo.user.list}")
private List list;
@Value("${demo.user.map}")
private Map map;
}
@Value 与 @ConfigurationProperties 获取值的差异
@ConfigurationProperties | @Value | 示例 | |
实现功能 | 批量注入配置文件的属性值 | 一个一个指定 | |
松散绑定 | 支持 | 不支持 | user_name==userName |
SpEL | 不支持 | 支持 | #{10*2} |
复杂类型封装 | 支持 | 不支持 | ${demo.user.map} |
JSR303数据校验 | 支持 | 不支持 | 如下 |
JSR303数据校验_配置文件注入的值
校验数据是否为合法:添加 @Validated 注解,在属性上添加对应的注解,如验证邮箱是否正确,只需添加 @Email 注解
使用场景
如果只是在某个业务逻辑中需要获取配置文件中的某个属性值,就使用 @Value
如果专门使用javaBean和配置文件进行映射,就使用 @ConfigurationProperties
加载指定配置文件
@ConfigurationProperties 默认从全局配置文件(application.properties/application.yml)中获取值, 所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。
@PropertySource
用于加载局部配置文件;把需要分离的数据提取出来,在resources 目录下 新建一个properties或yml 文件,把提取的数据放入;使用注解 @PropertySource 加载指定的配置文件;
@Component
@PropertySource(value = "classpath:config/user.properties")
@ConfigurationProperties(prefix = "demo.user")
public class UserProperties {
private String name;
private Integer age;
private String location;
private Date birthday;
private List list;
private Map map;
}
多环境支持
Profile 是 Spring 用来针对不同的环境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是application-{profile}.properties / application-{profile}.yml ;
- 方式一:
- 创建两个文件 application-dev.properties 与 application-prod.properties
- 在application.properties激活指定profile
spring.profiles.active=dev
- 未指定哪个profile文件时, 默认使用 application.properties 中的配置。
- 方式二
命令行参数指定,可以直接在测试的时候,配置传入命令行参数 --spring.profiles.active=dev
打jar包运行时:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
- 方式三
虚拟机参数指定
-Dspring.profiles.active=dev