一、配置文件
Spring boot 使用一个全局配置文件,配置文件名,固定为 application.properties 或 application.yml。
通过配置文件修改springboot的配置的默认值,springboot在底层都给我们自动配置好。
YAML(YAML Ain‘t Markup Language)
YAML A Markup Language:是一个标记语言。
YAML isn't Markup Language:不是一个标记语言。
application.properties:
server.port=8080
application.yml:
server:
port: 8090
二、yml语法格式
(一)基本语法
k:(空格)v:表示一对键值对(空格必须有)。
server:
port: 8090
path: /hello
使用缩进表示层级关系。
缩进时不允许使用tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
大小写敏感。
(二)支持的三种数据结构
- 字面量:单个的、不可再分的值(数字、字符串、布尔)。
字符串默认不用加上单引号或双引号。
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi"
#表示 zhangsan 换行 lisi
'':单引号;会转义字符串里面的特殊字符;特殊字符最终只是一个普通的字符串数据
name: "zhangsan \n lisi"
#表示 zhangsan \n lisi
- 对象:键值对的集合。
k:v写法:
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
- 数组:一组按次序排列的值(List、Set)。
用-值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
(三)配置文件读取
Person类:
package com.roger.springboot02configure.bean;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ConfigurationProperties 告诉Springboot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面中的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*/
@Data
@Component
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
/**
* 使用value方式的进行读取
* @Value("${person.lastName}")
*/
private String lastName;
/* SpEL表达式
@Value("#{11*2}")*/
private Integer age;
/**
* 必须以email的邮箱格式
*/
@Email
private String email;
/*@Value("${true}")*/
private Boolean boss;
/* @Value("${person.birth}")*/
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
Dog类:
package com.roger.springboot02configure.bean;
import lombok.Data;
@Data
public class Dog {
private String name;
private Integer age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
yml配置文件:
server:
port: 8090
person:
lastName: zhangsan
#另一种写法
###last-name: zhangsan
age: 18
email: test@qq.com
boss: false
birth: 2018/12/12
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhaoliu
- lanlan
dog:
name: xiaogou
age: 2
properties配置写法:
server.port=8080
#idea默认utf-8编码
#如果使用properties进行配置,则需要在idea中进行编码设置。
person.last_name=张行
person.age=18
person.email=test@qq.com
person.boss=false
person.birth=2018/12/12
person.maps.k1=v1
person.maps.k2=v2
person.lists=lisi,zhaoliu,lanlan
person.dog.name=xiaogou
person.dog.age=2
如果使用properties进行配置,则需要在idea中进行编码设置。
test类:
package com.roger.springboot02configure;
import com.roger.springboot02configure.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBoot02ConfigureApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
测试结果:
(四)@Value获取值和@ConfigurationProperties获取值的比较
| @ConfigurationProperties | @Value |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持
| 不支持 |
SpEl表达式 | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果专门编写一个javaBean来获取配置文件的值,使用@ConfigurationProperties
@ConfigurationProperties
与@Bean结合为属性赋值
与@ProperySource(只能用于properties文件)结合读取指定文件
(五)@ProperySource
加载指定配置文件
@Data
@Component
@Validated
/**
*加载person.properties配置文件的内容。
*/
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
/**
* 使用value方式的进行读取
* @Value("${person.lastName}")
*/
private String lastName;
(六)@ImportResource
导入Spring组件配置文件,让配置文件里面的内容生效
Spring boot 里面没有Spring配置文件,如果想让编写的配置文件生效,需要用@ImportResource标注在一个配置类上进行加载。
新建beans.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.roger.springboot02configure.service.HelloService"></bean>
</beans>
新建service.Helloservice类
package com.roger.springboot02configure.service;
public class HelloService {
}
在Application种增加@ImportResouce语句
package com.roger.springboot02configure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
//导入spring配置文件
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigureApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot02ConfigureApplication.class, args);
}
}
编写测试方法
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService(){
Boolean b = ioc.containsBean("helloService");
System.out.println("helloService 是否存在:"+b);
}
(七)@Bean
Spring boot推荐给容器中添加组件的方式(全注解的方式)
配置类
package com.roger.springboot02configure.config;
import com.roger.springboot02configure.service.BeanService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration 指明当前类是一个配置类,就是来替代之前的Spring配置文件
* 在配置文件种用<bean></bean>标签添加组件
*/
@Configuration
public class MyAppConfig {
@Bean
public BeanService beanService(){
return new BeanService();
}
}
测试方法
/**
* spring boot 推荐的方式
* 用@Configuration
* 替代@ImportSource + bean.xml
*/
@Test
public void testTestService(){
Boolean b = ioc.containsBean("beanService");
System.out.println("beanService 是否存在:"+b);
}
(八)配置文件占位符
1.RandomValuePropertySource:配置文件中可以使用随机数
${random.value} 、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65535}
2.属性配置占位符
app.name=myApp
app.description=#{app.name} is a Spring Boot Application
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
${app.name:默认值}来指定找不到属性时的默认值
#idea默认utf-8编码
#如果使用properties进行配置,则需要在idea中进行编码设置。
person.lastName=李四${random.uuid}
person.age=${random.int}
#person.email=test@qq.com
#person.boss=false
person.birth=2018/12/12
person.maps.k1=v1
person.maps.k2=v2
person.lists=lisi,zhaoliu,lanlan
person.dog.name=${person.lastName}'s dog
#默认值
#person.dog.name=${person.lastName:default}'s dog
person.dog.age=2
(九)多环境支持
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。
1.多profile文件形式
-格式:application-{profile}.properties
application-dev.properties、application-prod.properties
2.多profile文档块模式
Spring:
profile:
active: prod ##激活prod配置文件
## --- 表示一个文档块,相当于多个配置文件
---
spring:
profiles: prod
server:
prot: 80
---
spring:
profiles: default
server:
prot: 8080
---
spring:
profiles:dev
server:
prot: 8081
3.激活方式
-命令行: --spring.profiles.active=dev
-配置文件:spring.profiles.active=dev
-jvm参数:-Dspring.profiles.active=dev
(十)配置文件加载位置
spring boot启动会扫描以下位置的application.properties或者application.yml文件作为spring boot的默认配置文件。
1.file:./config/
2.file:./
3.classpath:./config/
4.classpath:./
以上是按优先级从高到低的顺序,所有位置的文件都会被加载(互补配置),高优先级配置内容会覆盖低优先级配置内容。
项目发布时,我们也可以通过命令行参数的形式,通过配置spring.config.location来改变默认配置
java -jar springboot-hello.jar --spring.config.location=d:/application.properties
同时有 application.yml 、application.properties、用户指定.properties时的优先级yml最高,properties文件第二。
(十一)外包配置加载顺序
1.命令行参数
java -jar springboot.jar --server.port=8082
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类的@propertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
(十二)@Conditional
@Confitional 指定的条件成立,才给容器中添加组件,配置里面的所有内容才生效。
通过debug=true,带你自动匹配报告,可以查看哪些自动配置类已经生效,哪些未生效。