概要
1.yaml基本语法(YAML Ain't Markup Language,也可简写为yml)
2.配置文件值注入(案例)
3.配置文件使用
SpringBoot使用一个全局的配置文件,配置文件名是固定的: application.properties/application.yml/application.yaml。
配置文件的作用:修改SpringBoot在底层都给我们自动配置好的默认值。
一、TAML基本语法
1.基本语法:
– 使用缩进表示层级关系
– 缩进时不允许使用Tab键,只允许使用空格。
– 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
– 大小写敏感
– 键值对之间一定要使用空格
2.支持的三种数据结构
– 对象:键值对的集合
– 数组:一组按次序排列的值
– 字面量:单个的、不可再分的值
2.1 字面量
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
2.2 对象、map
k:v方式:
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 20}
2.3 数组
用- 值表示数组中的一个元素
pets:
‐ cat
‐ dog
‐ pig
行内写法:
pets: [cat,dog,pig]
二、配置文件值注入(案例)
.yaml配置文件
person:
last-name: sunzh
age: 28
boss: false
birth: 2018/08/08
maps: {height: 180,weight: 180}
lists: [red,yellow,black]
dog:
name: Tom
age: 2
javaBean:
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* @Component 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Data //import lombok.Data; 使用Lombok来优雅的编码,@Data注解默认提供了getter和setter和tostring方法
@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;
}
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--Lombok包引用-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- 版本号可以不写,在前一篇中说到,他的父父类dependencies中已经对lombok进行了版本控制,默认1.16.22-->
<!--<version>1.16.20</version>-->
<scope>provided</scope>
</dependency>
Test类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigApplicationTests {
@Autowired
private Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
运行结果:
Person(lastName=sunzh, age=28, boss=false, birth=Wed Aug 08 00:00:00 CST 2018, maps={height=180, weight=180}, lists=[red, yellow, black], dog=Dog(name=Tom, age=2))
.properties配置文件
person.last-name=sunzh
person.age=28
person.boss=false
person.birth=2018/08/08
person.maps.height=180
person.maps.weight=180
person.lists=1,2,3,4
person.dog.name=小狗
person.dog.age=2
javaBean:
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
/**
* value 相当于bean
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"</property>
* <bean/>
*/
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
Test运行结果:
Person(lastName=sunzh, age=22, boss=true, birth=null, maps=null, lists=null, dog=null)
//由于list,map,pojo都是复杂类型,不可以用value()进行赋值。
注意:
在properties配置文件情况下,
也可以使用@ConfigurationProperties(prefix = “person”)注解,
但是不可以对属性使用@Value()注解,
这种情况下,对象的所有成员变量都会被赋值
@Value获取值和@ConfigurationProperties获取值比较
菜单 | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
JSR303数据校验,即在类上加入@Validated注解,在邮箱属性上加@Email,则会校验邮箱是否符合规范。
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
@PropertySource&@ImportResource&@Bean
@PropertySource(value = {"classpath:datasource.properties"})//注释在类上,一般用来引入非Spring的配置文件
@ImportResource(locations = {"classpath:beans.xml"})//标注在一个配置类上,使Spring的配置文件生效
@Bean给容器中添加组件
案例:
/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
* 在配置文件中用<bean><bean/>标签添加组件
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名,即helloService02
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
三、配置文件的使用
1.配置文件占位符
随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
占位符获取之前配置的值,如果没有可以是用:指定默认值
person.last-name=sunzh${random.uuid}
person.age=${random.int}
person.birth=2018/08/08
person.boss=false
person.maps.height=180
person.maps.weight=180
person.lists=1,2,3,4
person.dog.name=${person.pet:Tom}_dog //如果没有找到person.pet,则取Tom
person.dog.age=2
2.多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
application-dev.properties、application-prod.properties
默认使用application.properties的配置
yml支持多文档块方式
server:
port: 8081
spring:
profiles:
active: prod //默认使用prd环境
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
激活指定profile
1、在主配置文件中指定 spring.profiles.active=dev
2、命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数
3、虚拟机参数;
-Dspring.profiles.active=dev
//使用上面这三种方式激活,则会忽略上面prd环境,而去使用指定的激活方式dev环境
3.配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/ //项目根目录下的config目录
–file:./ //项目根目录
–classpath:/config/ //resource根目录下的config目录
–classpath:/ //resource根目录
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc