- SpringBoot学习(二)SpringBoot的配置
- 配置文件
- 全局配置文件
- YAML语法
- 基本语法
- 字面量,普通的值(数字、字符串、布尔)
- 对象、map(键值对)
- 数组(List、Set、Array)
- 配置文件值注入
- @ConfigurationProperties
- YAML 文件配置
- properties文件配置
- @Value
- @Value和@ConfigurationProperties
- @PropertySource与@ImportResource
- 配置文件占位符
- 随机数
- 占位符
- Profile
- 文件名称
- 激活
- yaml文档块编写
- SpringBoot配置文件加载位置
- SpringBoot外部配置的加载顺序
SpringBoot使用一个全局的配置文件,配置文件名称是固定的,修改自动配置的默认值
- application.properties
- application.yml
YAML(YAML Ain’t Markup Language)
YAML A Markup Language(YAML 是一种标记语言),YAML isn’t Markup Language(YAML 不是一种标记语言)。以数据为中心
spring:
application:
name: springboot-02-config
server:
port: 8080
YAML语法
基本语法
key:(空格)value:表示已对键值对,空格必须有。以空格缩进来控制层级关系,只要左对齐的一列数据,都是同一个层级。属性和值大小写敏感。
字面量,普通的值(数字、字符串、布尔)key: value:字面量直接写,字符串默认不加单双引号
“”(双引号): 不会转义特殊字符,特殊字符会作为本身想表示的意思输出
name: "zhangsan n lisi" # 输出 zhangsan lisi
‘’(单引号): 会转义特殊字符,将特殊字符作为普通字符串输出
name: 'zhangsan n lisi' # 输出 zhangsan \n lisi对象、map(键值对)
key: value
# 一般写法
user:
name: zhangsan
age: 20
# 行内写法
student: {name: zhangsan, age: 20}
数组(List、Set、Array)
用- value表示数组中的一个元素
# 一般写法 pets: - cat - dog - pig # 行内写法 myPets: [cat, dog, pig]配置文件值注入 @ConfigurationProperties
默认从全局配置文件中获取值
YAML 文件配置@ConfigurationProperties(prefix = "person"):SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定
- prefix = "person":设置绑定配置的前缀
需要组件是容器中的组件,才能使用容器提供的@ConfigurationProperties(prefix = "person")功能。使用注解@Componet将组件添加到容器中
导入配置文件处理器,配置文件进行绑定就会有提示。导入之后需要重启应用
org.springframework.boot spring-boot-configuration-processor true
application.yml
spring:
application:
name: springboot-02-config
server:
port: 8080
person:
lastName: zhangshan
age: 18
boss: false
birth: 2017/12/11
maps: {k1: v1, k2: v2}
list:
- lishi
- wangwu
pet:
name: 大黄
age: 12
Person.java
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
Pet.java
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class Pet {
private String name;
private Integer age;
}
测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
测试结果
...
Person(lastName=zhangshan, age=18, boss=false, birth=Mon Dec 11 00:00:00 CST 2017, maps={k1=v1, k2=v2}, list=[lishi, wangwu], pet=Pet(name=大黄, age=12))
...
properties文件配置
person.last-name=张珊 person.age=18 person.birth=2000/10/5 person.boss=true person.maps.k1=v1 person.maps.k2=v2 person.list=A,B,C person.pet.name=小花 person.pet.age=5
测试结果
...
Person(lastName=张珊, age=18, boss=true, birth=Thu Oct 05 00:00:00 CST 2000, maps={k1=v1, k2=v2}, list=[A, B, C], pet=Pet(name=小花, age=5))
...
@Value如果中文出现乱码,那么在File→Settings→Editor→File Encodings中设置编码为UTP-8
@Value("")取值的写法也支持 字面量/${key}从环境变量、配置文件中获取值/#{SpEL}
@Component
// @ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("false")
private Boolean boss;
@Value("${person.birth}")
private Date birth;
@Value和@ConfigurationProperties
| @ConfigurationProperties | @Value | |
|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 需要一个个的指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复制类型封装 | 支持 | 不支持 |
@PropertySource与@ImportResource配置文件使用yaml或者properties,都能获取到值
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果写有javaBean和配置文件进行映射,使用@ConfigurationProperties
@PropertySource: 加载指定配置文件(properties)
@PropertySource(value = {"classpath:person.properties"})
// @PropertySource(value = {"classpath:person.yaml"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
@ImportResource: 导入Spring的配置文件,让配置文件生效
SpringBoot 中默认没有Spring配置文件,自己写的配置文件也不会自动生效,需要使用@ImportResource注解标注在配置类上,才能让自己写的Spring配置文件生效
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Springboot02ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot02ConfigApplication.class, args);
}
}
SpringBoot 推荐给容器中添加组件的方式(全注解方式):
@Configuration :标注的类属于配置类
@Bean :标注在方法上,将方法的返回值添加到容器中,容器中的组件名默认是方法名
@Configuration
public class MyAppConfig {
@Bean
public HelloService helloService() {
return new HelloService();
}
}
配置文件占位符
随机数
${random.value}
${random.int}
${random.long}
${random.uuid}
...
占位符
占位符去之前配置的值,如果没有,可以使用 : 指定
name: ${person.hello:lisi}_大黄:如果之前没有配置person.helloname使用 : 后面的 lisi
person:
lastName: zhangshan${random.uuid}
age: ${random.int}
boss: false
birth: 2017/12/11
maps: {k1: v1, k2: v2}
list:
- lishi
- wangwu
pet:
name: ${person.hello:lisi}_大黄
age: 12
Profileyaml和properties文件都适用
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
文件名称- application-{profile}.properties
- application-{profile}.yml
-
在主配置文件中进行配置激活
- .properties
spring.profiles.active={profile}- yaml
spring: profiles: active: {profile} -
命令行方式激活
java -jar xxx.jar --spring.profiles.active={profile}
使用---区分文档块
spring:
profiles:
active: dev
server:
port: 8080
person:
lastName: zhangshan${random.uuid}
age: ${random.int}
boss: false
birth: 2017/12/11
maps: {k1: v1, k2: v2}
list:
- lishi
- wangwu
pet:
name: ${person.hello:lisi}_大黄
age: 12
---
spring:
profiles: dev
server:
port: 8088
---
spring:
profiles: prod # 指定属于那个环境
server:
port: 9099
SpringBoot配置文件加载位置
SpringBoot启动时会扫描以下位置的application.properties/application.yml文件作为SpringBoot的默认配置文件
- file:./config/
- file:./
- classpath:./config/
- classpath:./
SpringBoot外部配置的加载顺序以上按照优先级由高到低的顺序,所有位置的文件都会被加载,相同的配置高优先级配置内容会覆盖低优先级配置内容,不同的配置会互补
可以通过spring.config.location改变默认的配置文件位置 ,指定的配置文件会和默认的配置文件形成互补配置
java -jar xxx.jar --spring.config.locaion=配置文件地址
Spring Boot支持多种配置,Spring Boot的配置文件不只是能写在以上的文件位置下(而且当前项目路径下的文件在使用maven打包的时候,也打不进jar包中),还可以写在其他位置,详细参照Spring Boot官方文档。
- 命令行参数
java -jar xxx.jar --server.port=xxx --配置项=值 ... - jar包外application-{profile}.properties或yml(带spring.profile)配置文件
- jar包内application-{profile}.properties或yml(带spring.profile)配置文件
- jar包外application.properties或yml(不带spring.profile)配置文件
- jar包内application.properties或yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性
优先级从高到低, 同样形成互补配置。优先加载命令行的,其次的是带profile,最后是不带profile的,由jar包外向jar包内加载



