目录
- 一、配置文件
- 二、YAML语法
- 三、配置文件值注入
- 四、配置文件占位符
- 五、Profile
- 六、配置文件加载位置
- 七、外部配置加载顺序
- 1.命令行参数
- 2.来自java:comp/env的JNDI属性
- 3.Java系统属性(System.getProperties())
- 4.操作系统环境变量
- 5.RandomValuePropertySource配置的random.*属性值
- 6.jar包外部的`application.properties`或`application.yml`(不带spring.profile)配置文件
- 7.jar包内部的`application.properties`或`application.yml`(不带spring.profile)配置文件
- 8.jar包外部的`application-{profile}.properties`或`application.yml`(带spring.profile)配置文件
- 9.jar包内部的`application-{profile}.properties`或`application.yml`(带spring.profile)配置文件
- 10.`@Configuration`注解类上的`@PropertySource`
- 11.通过`SpringApplication.setDefaultProperties`指定的默认属性
一、配置文件
Spring Boot使用一个全局的配置文件,配置文件名application是固定的;
- application.properties
- application.yml
- application.yaml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML
YAML(YAML Ain’t Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn’t Markup Language:不是一个标记语言;
标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
二、YAML语法
-
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
-
次等级的前面是空格,不能使用制表符(tab)
-
冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着
-
属性和值大小写敏感;
server:
port: 8081
path: /hello
字面量:普通的值(数字,字符串,布尔)
k: v
字符串默认不用加上单引号或者双引号;
""
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
eg: name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
''
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
eg: name: 'zhangsan \n lisi':输出;zhangsan \n lisi
对象、Map(属性和值):
k: v
在下一行来写对象的属性和值的关系;注意缩进
1.
person:
name: 张三
gender: 男
age: 22
2.行内写法
person: {name: 张三,gender: 男,age: 22}
数组(List、Set)
fruits:
- 苹果
- 桃子
- 香蕉
2.行内写法
fruits: [苹果,桃子,香蕉]
三、配置文件值注入
JavaBean:
public class Pet {
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;
}
@Override
public String toString() {
return "Pets{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
配置文件:
person:
name: 张三
gender: 男
age: 36
boss: true
birth: 1982/10/1
maps: {k1: v1,k2: v2}
lists:
- apple
- peach
- banana
pet:
name: 小狗
age: 12
测试类
package cn.clboy.helloworldquickstart;
import cn.clboy.helloworldquickstart.model.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class HelloworldquickstartApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
properties
上面yaml对应的properties配置文件写法
person.name=李四
person.age=34
person.birth=1986/09/12
person.boss=true
person.gender=女
person.lists=cat,dog,pig
person.maps.k1=v1
person.maps.k2=v2
person.pet.name="小黑"
person.pet.age=10
测试,发现中文会乱码,而且char类型还会抛出Failed to bind properties under ‘person.gender’ to java.lang.Character异常
中文乱码解决方法
在设置中找到File Encodings,将配置文件字符集改为UTF-8,并勾选:Transparent native-to-ascii conversion
yaml和properties配置文件同时存在,properties配置文件的内容会覆盖yaml配置文件的内容
配置文件值注入两种方式对比
松散绑定
例如Person中有lastName
属性,在配置文件中可以写成
lastName
或lastname
或last-name
或last_name
等等
SpEL
## properties配置文件
persion.age=#{2019-1986+1}
properties配置文件
persion.age=#{2019-1986+1}
Person类
#--------------------使用@ConfigurationProperties注解,会抛出异常--------------------
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private Integer age;
#--------------------使用@value注解 OK--------------------
@Component
public class Person {
@Value("${person.age}")
private Integer age;
JSR303数据校验
@ConfigurationProperties
支持校验,如果校验不通过,会抛出异常
@value
注解不支持数据校验
复杂类型封装
@value
注解无法注入map等对象的复杂类型,但list、数组
可以
@PropertySource
@PropertySource
注解的作用是加载指定的配置文件,值可以是数组,也就是可以加载多个配置文件
springboot默认加载的配置文件名是application
,如果配置文件名不是这个是不会被容器加载的,所以这里Person并没有被注入任何属性值
使用@PropertySource({"classpath:person.properties"})
指定加载person.properties
配置文件
使用这个注解加载配置文件就需要配置类使用@component
等注解而不是等待@EnableConfigurationProperties
激活,而且不支持yaml,只能是properties
@ImportResource
@ImportResource
注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource
标注在一个配置类上
注意!这个注解是放在主入口函数的类上,而不是测试类上
@Configuration
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
配置类@Configuration
—equals—> Spring配置文件
@Bean
使用@Bean
给容器中添加组件
package cn.clboy.helloworldquickstart.config;
import cn.clboy.helloworldquickstart.model.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
* Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*/
@Configuration
public class BeanConfiguration {
/**
*相当于在配置文件中用<bean><bean/>标签添加组件
*/
@Bean
public Pet myPet() {
Pet pet = new Pet();
pet.setName("嘟嘟");
pet.setAge(3);
return pet;
}
}
四、配置文件占位符
随机
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
可以引用在配置文件中配置的其他属性的值,如果使用一个没有在配置文件中的属性,则会原样输出
可以使用:
指定默认值
五、Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
多profile文件形式
文件名格式:application-{profile}.properties/yml,例如:
- application-dev.properties
- application-prod.properties
程序启动时会默认加载application.properties
,启动的端口就是8080
可以在主配置文件中指定激活哪个配置文件
yml支持多文档块方式
每个文档块使用---
分割
server:
port: 8080
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod
激活指定profile的三种方式
1.在配置文件中指定 spring.profiles.active=dev(如上)
2.项目打包后在命令行启动
java -jar xxx.jar --spring.profiles.active=dev;
3.虚拟机参数
-Dspring.profiles.active=dev
六、配置文件加载位置
springboot 启动会扫描以下位置的application.properties
或者application.yml
文件作为Spring boot的默认配置文件
file: ./config/
file: ./
classpath: /config/
classpath: / -->first load ↑
优先级由高到底,高优先级的配置会覆盖低优先级的配置(优先级低的先加载);
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
这里项目根路径下的配置文件maven编译时不会打包过去,需要修改pom
<resources>
<resource>
<directory>.</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.yaml</include>
</includes>
</resource>
</resources>
我们还可以通过spring.config.location
来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
java -jar xxx.jar --spring.config.location=/home/cloudlandboy/application.yaml
七、外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar xxx.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开;
--配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
再来加载不带profile
6.jar包外部的application.properties
或application.yml
(不带spring.profile)配置文件
7.jar包内部的application.properties
或application.yml
(不带spring.profile)配置文件
优先加载带profile
8.jar包外部的application-{profile}.properties
或application.yml
(带spring.profile)配置文件
9.jar包内部的application-{profile}.properties
或application.yml
(带spring.profile)配置文件
10.@Configuration
注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties
指定的默认属性
所有支持的配置加载来源:
参考官方文档