Spring Boot 的配置文件分为 properties
与 yaml
两种形式且必须命名为 application
。
Spring Boot 的配置文件通常放置于 src/main/resources
文件夹下。
properties
与 yaml
简单对比:
properties | yaml | |
---|---|---|
语法结构 | key=value | key: value(注意冒号后面需要空格) |
文件后缀名 | .properties | .yaml 或.yml |
级联属性 | #用点连接 server.port=9090 | # 分层 server: port: 9090 |
# 注释文本 [key]:[空格][value] # 使用缩进表示层级关系,同层级必须左对齐,缩进空格数不重要,一般使用两个空格 [key1]: [空格][空格][key2]:[空格][value]
#
开头表示注释。spring: redis: host: localhost port: 6379
可以直接书写,不需要加引号,如下:
student: name: Jacks age: 20 man: true
# 写法一 student: name: Jacks age: 20 man: true # 写法二 student: {name: Jacks, age: 20}
# 写法一 fruit: - apple - orange - banana # 写法二 fruit: [apple,orange,banana]
- 值
的形式表示数组中的一个元素。[]
包裹且用,
隔开每一个元素。yaml: value: # 字面量写法 str: 字符串,默认不\n需要加引号,不会转义特殊字符。 str2: '单引号包裹的字符串不识别转义字符\n,与不加引号效果一样' str3: "双引号包裹的字符串会识别转义字符\n" num: 666 dNum: 666.88 birth: 2020/10/27 12:23:34 # 集合写法 array、list、set 写法,两种方式都可以 list: - hello - world - 你好 - 世界 set: [ hello,world,你好,世界 ] # 对象/map map: { name: jacks,age: 22,gender: man} # 对象数组 students: - {name: 张三, age: 18} - {name: 李四, age: 19}
age: 20 # 可以使用 ${} 引用配置文件中的其他项的值 student: age: ${age}
student: name: 张三 age: 20 address: - 北京 - 上海 - 深圳 - 广州
@Value
读取@RestController public class YmlController { // 获取属性值,${}中匹配配置文件中的 key @Value("${student.name}") private String username; @Value("${student.age}") private int age; // 获取数组 @Value("${address[0]}") private String address; @GetMapping("hello") public String hello() { System.out.println(username); System.out.println(age); System.out.println(address); return "访问成功:hello"; }
org.springframework.core.env.Environment
对象读取@RestController public class YmlController { @Autowired Environment environment; @GetMapping("/env") public String getEnv() { String name = environment.getProperty("student.name"); String age = environment.getProperty("student.age"); String address = environment.getProperty("address[0]"); System.out.println(name); System.out.println(age); System.out.println(address); return "访问成功:hello"; } }
@ConfigurationProperties
注解主要用于将实体类对象与配置文件进行绑定,为实体对象注入属性。
<!-- 让实体类在配置文件中有对应的提示 --> <!-- 对实体类的属性生成 json 文件,存在于 target/classes/META-INF --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
@Data // lombok,提供 getter 、 setter 等方法 @Component // 注入到容器,交由 spring 管理 @ConfigurationProperties("person") // 使用时需要指定前缀 public class Person { private String name; private String age; private List<String> hobby; }
person: name: jacks age: 23 hobby: - 编程 - 游戏 - 动漫
@RestController public class YmlController { @Autowired Person person; @GetMapping("person") public Person student() { return person; } }
开发时 Spring Boot 应用时,通常会有开发环境、测试环境和生产环境等不同环境,其数据库地址,服务器端口等等配置都会有差别,为了避免每次打包部署都需要修改配置项,所以提供了 profile 功能来动态切换配置环境。
分别创建三个配置文件:
application-test.yml
application-dev.yml
application-pro.yml
需要注意的是,前面的 application
名字是固定的,后面的 -xxx
是自定义的。
激活配置文件,在 application.yml
文件中如下配置:
# 表示激活 application-dev 配置文件,要激活哪个文件,需要匹配后面的 application-xxx.yml 中的xxx spring: profiles: active: dev
# 激活 spring: profiles: active: pro --- # 标识为 default 的配置文件 spring: profiles: default server: port: 8081 --- # 标识为 dev 的配置文件 spring: profiles: dev server: port: 8082 --- # 标识为 test 的配置文件 spring: profiles: test server: port: 8083 --- # 标识为 pro 的配置文件 spring: profiles: pro server: port: 8084
---
分割上下,形成多个文件块。spring.profiles
指定每块文件的名字。spring.profiles.active
指定激活哪些文件块。spring: profiles: active: dev
虚拟机参数(VM optionsdd):-Dspring.profiles.active=test
命令行参数:--spring.profiles.active=pro
能被 Spring Boot 应用扫描到的路径优先级从高到低排序:
file:./config/
file:./
classpath:/config/
classpath:/
所有文件都能被加载,高优先级的配置文件会覆盖低优先级配置文件的内容。