1.配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;
YAML:标记语言
以数据为中心,比json、xml更适合做配置文件;
示例:server: port:8081
2. YMAL语法
2.1 基本语法
k:(空格)v :键值对,v前面必须有空格。
以空格来控制层级关系,只要是左对齐的数据,表示同一级别。
大小写敏感
server:
port: 8080
path: /hello
2.2 值的写法
字面量:普通的值(数字,字符串,布尔):
k: v : 字面量直接写;
字符串默认不用加单引号或双引号;
当家双引号"“时:不会转义特殊字符,比如”/n",会换行
但是,单引号’‘会转义字符,’/n’,显示的就是 /n
对象、map(属性和值)(键值对):
k: v :在下一行来写对象的属性和值的关系;注意缩进,对象也是k: v的形式
user :
name : 张三
age : 22
行内写法
user: {name: 张三,age: 22}
数组(List、Set):
用 -值 表示数组中的一个元素
users:
- jack
- tom
- lucy
行内写法:
users: [jack,tom,lucy]
2.3 配置文件值注入
2.3.1 yaml配置文件的注入
配置文件
person:
name: 张晓
age: 22
date: 2019/11/20
list:
- java
- c
- c#
dog:
dogName: 柯基
dogAge: 2
将配置文件与对应的类绑定
//@ConfigurationProperties 注解将配置文件中的person与该类绑定,默认从全局变量获取值
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date date;
private List<Object> list;
private Dog dog;
可以导入配置文件处理器,之后编写配置文件就会有自动提示
<!-- 配置文件处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
2.3.2 propertites文件
需要注意IEDA默认是utf-8编码,需要在setting→file encoding中选中自动转换编码,否则会出现中文乱码
还有另一个配置文件注入方式 @Value()
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private int age;
2.3.3 两种注入方式比较@Value 和 @ConfigurationProperties
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 可以批量注入配置文件中的值 | 只能单个值指定 |
松散绑定(即_可以转换,驼峰写法) | 支持 | 不支持 |
EL表达式 | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型数据(map,list等) | 支持 | 不支持 |
选择:
①.当只是在某个业务逻辑中需要获取配置文件中的某个值,使用@Value;
②.当有一个JavaBean类需要和配置文件进行映射时,使用@ConfigurationProperties
2.3.4 配置文件数据校验(JSR303)
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
//此处name的值就必须是一个邮箱格式
@Email
private String name;
2.3.5 @PropertySource & @ImportResource
@PropertySource:加载指定的配置文件
//@ConfigurationProperties 注解将配置文件中的person与该类绑定
//@PropertySource() 从指定的配置文件中获取值
@PropertySource(value = "classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
//@Value("${person.name}")
private String name;
@ImportResource:在主配置类上使用,导入spring的配置文件,让配置文件里的内容生效
<?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.wn.springboot01.service.HelloService"/>
</beans>
//beans.xml 是编写的spring配置文件,这样加载进来就可以生效
@ImportResource(locations = "classpath:beans.xml")
@SpringBootApplication
public class SpringBoot01Application {
public static void main(String[] args) {
SpringApplication.run(SpringBoot01Application.class, args);
}
}
SpringBoot不推荐上面的用法,而是使用配置类,全注解开发
配置类:spring配置文件
/**
* @Configuration:指明当前类是一个配置类,替代之前的spring配置文件
*/
@Configuration
public class MySpringBootConfig {
/**
* @Bean:相当于标签<bean></bean>,
* 将方法返回值添加到容器,方法名就是容器中组件的默认id
*
*/
@Bean
public HelloService helloService(){
return new HelloService();
}
}
3.配置文件可以使用占位符${}
4.Profile
4.1 多profile文件
主配置文件可以多个,application-dev.properties/yml、application-pro.properties/yml...
默认使用application.properties配置文件。
4.2 yml支持多文档块方式
#根据---来划分文档块
server:
port: 8080
spring:
profiles:
active: dev
---
server:
port: 8081
profiles: dev
---
server:
port: 8082
profiles: pro
4.3 profile激活方式
4.3.1 在配置文件中可以通过spring.profiles.active = dev/pro来指定激活哪一个配置文件
4.3.2 命令行: --spring.profiles.active=dev
4.3.3 虚拟机参数:-Dspring.profiles.avtive=dev
5.配合文件加载位置
SpringBoot启动会扫描一下位置的application.properties或者application.yml文件作为默认配置文件
- file:./config/ 项目根目录下config文件夹中配置文件
- file:./ 项目根目录下的配置文件
- classpath:/config/ resource目录下config文件夹中的配置文件
- classpath:/ resource目录下配置文件
以上位置优先级由高到低,且高优先级的配置会覆盖低优先级;
springboot从以上4个位置加载配置文件,互补配置,相同的配置根据优先级高低来覆盖。
还可以通过spring.config.location来改变默认的配置文件位置:
项目打包好之后,可以使用命令行参数的形式,在启动项目的时候来指定配置文件位置;指定位置的配置文件和默认位置的配置文件共同起作用形成互补配置:
java -jar 包名.jar --spring.config.location=路径
7.外部配置加载顺序
springboot可以从以下位置加载配置;优先级由高到低,高优先级配置覆盖低优先级,所有配置文件都会加载,形成互补
- 1.命令行参数
- 2.来自java:comp/env的JNDI属性
- 3.Java系统属性(system.getProperties())
- 4.操作系统环境变量
- 5.RandomValuePropertySource配置的random.*属性值
- 6.jar包外部的application-{profile}.properties/yml(带spring.profile)配置文件
- 7.jar包内部的application-{profile}.properties/yml(带spring.profile)配置文件
- 8.jar包外部的application-{profile}.properties/yml(不带spring.profile)配置文件
- 9.jar包内部的application-{profile}.properties/yml(不带spring.profile)配置文件