了解SpringBoot的配置文件
Spring Boot的配置(配置文件,加载顺序,配置原理)之配置文件
配置文件
Spring Boot使用一个全局配置文件,配置文件名是固定的
- application.properties
- application.yml
配置文件的作用:修改Spring Boot自动配置的默认值,即修改Spring Boot在底层都给我们配置好的值
YAML(YAML Ain't Markup Language)
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件;
YAML:以数据为中心,比json、xml更适合做配置文件
YAML配置例子(冒号后面一定要加空格)
server:
port: 8081
XML:配置例子
<server>
<port>8081</port>
</server>
1.YAML的语法
1.基本语法
属性与值的关系: k:(空格)v : 表示一对键值对(空格不能省略);
以空格的缩进来控制层级关系:只要是左对齐的数据都是都同一个层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感的;
2.值的写法
字面量:普通的值(数字,字符串,布尔)
k: v 字面直接来写;
一般字符串不用加上单引号或者双引号;
“双引号”:会转义字符串里面的特殊字符,特殊字符会作为本身想标识的意思
name: "zhangsan /n list"
输出:zhangsan 换行 list
‘单引号’:不会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan /n list'
输出:zhangsan /n list
对象、Map(属性和值)(键值对):
k: v 在下一行来写对象的属性和值的关系;注意使用空格缩进
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
数组(List、Set):
用 -(空格)值 表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法
pets: {cat,dog,pig}
3.配置文件值注入
1.@ConfigurationProperties(默认从全局配置文件中取值)
配置文件
server:
port: 8081
person:
lastName: zhangsan
age: 19
boss: false
birth: 2020/5/20
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 旺财
age: 2
javaBean
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉springBoot将本类中的所有属性和配置文件相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器提供的功能;
**/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
导入配置文件处理器,配置文件进行绑定就会有提示(配置中的提示满足驼峰命名法的切换lastName=last-name)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.@Value
/**
* Spring底层的Value,之前是在Spring配置文件中
* <bean>
* <property name="lastName" value="字面量 / ${key}-从环境变量、配置文件中获取值 / #{spel}"><property/>
* </bean>
* 以前支持的,在@Value中都支持
**/
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
3.@Value获取值和@ConfigurationProperties获取值比较
@ConfigutationProperties | @Value | |
批量注入 | 支持 | 不支持 |
松散绑定(松散语法:lastName=last_name=last-name) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装(对象、map) | 支持 | 不支持 |
配置文件无论是ymal还是properties他们都能获取到值
总结:
如果说只是在某个业务逻辑(Controller、Service)中获取一下配置文件中的某项值,使用@Value
如果说我们专门编写了一个javabean来和配置文件进行映射,则使用@ConfigurationProperties
4.配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String lastName;
5.@PropertySource&ImportResource
- @PropertySource:加载指定的配置文件(如果全局配置文件中有符合的前缀属性会先加载全局文件,就不会再去寻找PropertySource标注的文件)
@PropertySource("classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
- @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
- Spring Boot中推荐的添加组件的方式
1.不编写xml文件,使用全注解的方式(配置类==》配置文件)
2.使用@Bean注解来给容器中添加组件
/**
* 指明当前类为配置类
* 在配置文件中用bean来添加组件
* 配置类中用@Bean
**/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService(){
System.out.println("@Bean给容器添加组建了");
return new HelloService();
}
}
4.配置文件占位符
1.随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2.占位符获取之前配置的值,如果没有可以使用: 指定默认值
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用),找不到属性时使用${key: value}来指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.dog.name=${person.hello: hello}_dog
person.dog.age=2
person.maps.k1=v1
person.maps.k2=15
person.lists=1,2,b
5.Profile
1.多Profile文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties;
2.yml支持多文档块方式
三个 - 可以分出分档块
profiles: 指定属于哪个环境(自定义),active:激活哪个环境
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8082
spring:
profiles: prod
---
server:
port: 8083
spring:
profiles: dev
---
3.激活指定profile
1.在默认全局配置文件中 spring.profiles.active=dev 激活
2.命令行的方式激活:
- cmd在jar包目录下 : java -jar xxx.jar --spring.profies.active=dev
- IDEA运行配置的program arguments(程序参数输入): --spring.profies.active=dev
- IDEA运行配置的VM options(虚拟机选项):-Dspring.profiles.active=dev