配置文件properties比yml优先级高
SpringBoot使用一个全句的配置文件,配置文件名是固定的;
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好了。
YAML, 是/不是一个标记语言
标记语言:
以前的配置文件:xxx.xml
yaml:以数据为中心,比json、xml等更适合做配置文件。
2、YAML语法:
1.基本语法
k: 空格V:表示一对键值对(空格必须有):
以空格的缩进来控制层级关系
server:
port: 8095
path: /hello
属性和值也是大小写敏感;
2.值的写法
字面量:普通的值(数字、字符串,布尔)
k: v: 字面直接来写;
字符串默认不用加上单引号或者双引号;
'':会转义特殊字符,特殊字符会被转为一个普通的字符串输出
name: "zhangsan \n lisi"
输出:zhangsan \n lisi
"":不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi"
输出:zhangsan
lisi
对象(属性和值)(键值对):
k: v :在下一行来写对象的属性和值的关系,注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
数组(list、set):
用-值表示数组中的一个元素
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
3.配置文件值注入
配置文件yml
person:
lastName: zhangsan
age: 18
boss: false
birth: 2018/10/10
maps: {
k1: v1,
k2: 12,
k3: 20
}
lists:
- lisi
- wangwu
dog:
name: 小狗
age: 2
javaBean:
/**
*通过@ConfigurationProperties(prefix = "person")注入
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boos;
private Date birth;
private Map maps;
private List lists;
private Dog dog;
我们可以导入pom.xml配置文件处理器,这样编写yml就会有提示
org.springframework.boot
spring-boot-configuration-processor
true
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boos;
1.idea中yml配置文件默认utf-8有可能乱码
2.@value获取值与@configurationProperties获取值比较
@configurationProperties
@value功能
批量注入配置文件中的属性
一个个指定
松散绑定
支持
不支持
SpEL
不支持
支持(#/${}...)
JSR303数据校验
支持
不支持
支持
不支持
配置文件yml还是properties他们都能获取到值。
如果说,我们只是在某个业务逻辑中,需要获取一下配置文件中的某项值,我们使用@value
如果为list或map或专门编写了一个javaBean来和配置文件进行映射,使用@ConfigurationProperties。
3.配置文件注入值数据校验
@ConfigurationProperties(prefix = "person")
@Validated
4.@PropertySource与ImportResource
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties: 告诉springboot将奔雷中的所有属性和配置文件中的相关的配置进行绑定
* prefix = "persion" : 配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器提供的ConfigurationProperties功能
* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
// @Value("${person.last-name}")
private String lastName;
// @Value("#{11*2}")
private Integer age;
// @Value("true")
private Boolean boos;
private Date birth;
private Map maps;
private List lists;
private Dog dog;
@ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效;
SpringBoot里面没有Spirng的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来@importResource,标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
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">
SpringBoot推荐给容器中添加组件的方式:
1.配置类===Spring配置文件
2.使用@Bean给容器中添加组件
/**
*@Configuration:指明当前类是一个配置类,就是来替代之前的Spring配置文件
* 在配置文件中用 标签添加组件
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中
@Bean
public HelloService helloService(){
System.out.println("配置类:");
return new HelloService();
}
}
4、配置文件占位符
1.随机数
person.last-name=李四${random.uuid}
person.age=${random.int}
2.占位符获取之前的配置的值,如果没有可以用:指定默认值
person.dog.name=${person.last-name}_dog
person.dog.name=${person.hello:hello}_dog
5、Profile
1、多Profile文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
2、yml支持多文档块方式
server:
port: 8095
spring:
profiles:
active: prod
---
server:
port: 8080
spring:
profiles: dev
---
server:
port: 8081
spring:
profiles: prod