主要关于配置文件,加载顺序和配置原理
SpringBoot的配置
一、配置文件
1、配置文件
Spring Boot使用两种全局配置文件
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层给我们自动配置好了
2、yml语法
(1)基本语法
k:(空格)v
以空格缩进的量来表名层级关系
例如:
server:
port: 8081
(2)值的写法
字面量:普通的值(数字,字符串,布尔)
k: v
字符串默认不加单引号或者双引号
特殊意义可以加
“ ”:双引号,不会转义字符串里面的特殊字符
例如:
name: “张三 \n lisi”–》输出:张三 \n lisi
’ ‘:单引号,会转义特殊字符
例如:
“张三 \n lisi”–》输出:张三 换行 lisi
对象,Map(键值对)
k: v: 在下一行写属性或者值,注意缩进
frieng:
lastname: zhangsan
age:20
行内写法:
friend: {lastName: zhangsan,age: 18}
数组(List、set)
用-值表示数组的一个元素
perm:
- cat
- dog
- pig
行内写法:
perm: [cat,dog,pig]
例如:
测试
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
这是一个关于@ConfigurationProperties(prefix = “person”)依赖
编写实体类
package com.uestc.wpp.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.awt.*;
import java.util.LinkedList;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean sex;
private Map<String,Object> maps;
private LinkedList<Object> lists;
private Dog dog;
public void setLists(LinkedList<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", sex=" + sex +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
package com.uestc.wpp.bean;
public class Dog {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
配置属性
server:
port: 8081
person:
lastName: zhangsan
age: 18
sex: true
maps: {k1: v1,k2: v2}
lists:
- lisi
- wangwu
dog:
name: 小狗
age: 2
测试
package com.uestc.wpp;
import com.uestc.wpp.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class WppApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
测试结果
3、properties配置文件
person.last-name=李四
person.maps.k2=v2
person.maps.k3=v3
person.age=18
person.dog.age=18
person.dog.name=xiaobai
person.sex=true
输出为
会发现中文有乱码,需要修改设置
setting-FileCoding
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020111910412479.png?x-oss-process=image/watermark,ty
解决
4、利用@Value注解配置
package com.uestc.wpp.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.Map;
@Component
public class Person {
@Value("${person.lastName}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean sex;
private Map<String,Object> maps;
private LinkedList<Object> lists;
private Dog dog;
public void setLists(LinkedList<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", sex=" + sex +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
与@ConfiguratinoProperties的比较
@ConfigurationProperties | @Value | |
---|---|---|
功能上 | 批量注入文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型数据注入 | 支持 | 不支持 |
SpEL: @Value("#{11*2}")
数据校验:例如@Email注解,用来校验输入数据是不是邮箱
5、@PropertySource与@ImportResource
(1)@PropertySource
@PropertySource:加载指定的配置文件,如果把所有的配置都放到application文件中就很多,所以利用这个注解作为外部引入
建立一个person.properties文件,配置内容为
person.last-name=王五
person.maps.k2=v2
person.maps.k3=v3
person.age=18
person.dog.age=18
person.dog.name=xiaobai
person.sex=true
person.lists=l1
代码如下
package com.uestc.wpp.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.Map;
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String lastName;
private Integer age;
private Boolean sex;
private Map<String,Object> maps;
private LinkedList<Object> lists;
private Dog dog;
public void setLists(LinkedList<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", sex=" + sex +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
输出内容为:
(2)@ImportSource
@ImportSource:导入Spring的配置文件,让配置文件里面的内容生效
在Resources文件夹下建立一个bean.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.uestc.wpp.service.HelloService"></bean>
</beans>
注意要建立一个类com.uestc.wpp.service.HelloService
测试:
package com.uestc.wpp;
import com.uestc.wpp.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;
@ImportResource(locations = {"classpath:bean.xml"})
@SpringBootTest
class WppApplicationTests {
@Autowired
Person person;
@Autowired
ApplicationContext ioc;
@Test
void contextLoads() {
System.out.println(ioc.containsBean("helloService"));
}
}
输出为:true表明配置成功
6、@Configuration
@Configuration指明当前类是一个配置类;就是来替代之前的Spring配置文件,在配置文件中用标签添加组件
具体配置代码:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAppConfig {
@Bean
public void helloWorld(){
System.out.println("helloWorld添加组件成功");
}
}
这个方法可以将返回值添加到容器中,容器中的组件默认的id就是方法名。
7、Profile多环境
Profile是Spring对不同环境提供都不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
(1)多Profile文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties
默认使用application.properties
例如分别建立开发和生产环境的Profile,分别为application-dev.properties,application-prod.properties
application-dev.properties设置为:
server.port=8082
application-prod.properties设置为:
server.port=80
(2)激活Profile
默认启动的是application.properties,如果要激活其他Profile,如下所示
①properties指定配置
在指定配置文件中激活spring.profiles.active=dev
这时候port为8082,如下图所示
②yml文档块激活
过时了,不知道最新的是什么
③命令行式
两种:命令行式
或者虚拟机式
④打包方式(待补充)
打包之后利用cmd命令运行
8、配置文件加载位置
根据加载优先级从高到低罗列:
file:/config/
file:./
classpath:/config/
classpath:/
其中file根目录,与src目录同级别,calsspath是Resources文件
SpringBoot会从这四个位置全部加载配置文件,他们之间会进行互补配置,对于重复的配置会选择高优先级的配置。
9、外部配置的加载顺序
SpringBoot也可以从以下位置进行加载配置;优先级从高到低;高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置
1,命令行配置
2,来自java:com/env的JNDI属性
3,java系统属性
4,操作系统环境变量
5,RandomValuePropertyResource配置的random.*配置
6,jar包外的application-{profiles}.propertie或者application.yml(带Spring.profile)配置文件
7,jar包内部的application-{profiles}.propertie或者application.yml(带Spring.profile)配置文件
8,jar包外部的application.propertie或者application.yml(不带Spring.profile)配置文件
9,jar包内部的application.propertie或者application.yml(不带Spring.profile)配置文件
10,@Configuration注解类上的@PropertySource
11,通过SpringAPlication.setDefaultProperties指定的默认属性