目录标题
1.配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的:application.properties
和application.yml
。配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
2.YAML
YAML(YAML Ain’t Markup Language)不是一个标记语言;YAML以数据为中心,比json、xml等更适合做配置文件;如下配置例子:
server:
port: 8081
2.1基本语法:
详细语法参考此教程:https://www.runoob.com/w3cnote/yaml-intro.html
yaml语法极其严格:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
2.2数据类型:
2.2.1字面量:普通的值
字面量:普通的值 [ 数字,布尔值,字符串 ]。字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
""
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
''
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
2.2.2对象、Map(属性和值)(键值对):
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。也可以使用 key:{key1: value1, key2: value2, ...}。
还可以使用缩进表示层级关系;
key:
child-key: value
child-key2: value2
2.2.3数组(List、Set):
以 - 开头的行表示构成一个数组:
pets:
‐ cat
‐ dog
‐ pig
行内写法
pets: [cat,dog,pig]
3.配置文件值注入
通过编写一个Person实体类,指定application.yml配置里面的值进行值注入,并在junit单元进行测试输出,首先在pom文件导入如下坐标,不然你编写YAML文件会出现图中问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
然后application.yml如下:
person:
last-name: 雾山五行
sex: 男
age: 20
birth: 2000/01/01
map:
property: v1
form: v2
list:
- list1
- list2
Dog:
name: 火焰狗
age: 2
然后编写实体类Person,首先把这个类标记为组件,使用@Component
,只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties
功能。
@ConfigurationProperties
:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;prefix = "person"
:配置文件中哪个下面的所有属性进行一一映射。然后springboot会自动将配置文件中配置的每一个属性的值,映射到这个组件中。
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private String sex;
private Integer age;
private Date birth;
private Map<String, String> map;
private List<Object> list;
private Dog dog;
}
测试输出:
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootConfigApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
3.1松散绑定(松散语法)和@value值注入方式
松散绑定是指比如我在yaml中写如下都是一样的
person:
lastName: 雾山五行
last-name: 雾山五行
last_name: 雾山五行
LAST_name: 雾山五行
LAST_NAME: 雾山五行
@Value获取值很麻烦,不推荐使用,他的作用用bean标签来解释如下
<bean class="Person">
<property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
<bean/>
3.2@Value获取值和@ConfigurationProperties获取值比较
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
;
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
4.加载指定的配置文件
4.1@PropertySource加载指定的properties
上面说的是加载SpringBoot的默认配置文件,但是呢,我们想弄个特殊,加载自己自定义的配置文件。则在实体类Person类中加入注解@PropertySource
。同时把默认配置文件的person属性改成persons来避免读到默认的配置文件的内容。
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
person.properties配置文件的内容
person.lastName=mary
person.sex=female
person.age=22
person.birth=2017/12/15
person.map.k1=v1
person.map.k2=14
person.list=a,b,c
person.dog.name=hot dog
person.dog.age=3
输出
4.2@PropertySource加载指定的YAML
有人说,你不是推荐使用YAML吗,上面的例子又是properties的,我要加载指定的YAML。可以,首先新建一个PropertySourceFactory
实体类,用于处理 yml 配置文件的属性资源工程
public class PropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
if (resource == null) {
return super.createPropertySource(name, resource);
}
List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
return sources.get(0);
}
}
然后新建一个YAML配置文件
person:
LAST_NaME: 法外狂徒:张三
sex: 男
age: 20
birth: 2000/01/01
map:
property: v1
form: v2
list:
- list1
- list2
Dog:
name: 火焰狗
age: 2
person实体类改为如下:注意:导入你自己刚刚写的那个PropertySourceFactory
实体类路径
import cn.smm.springbootconfig.utils.PropertySourceFactory;
@Data
@Component
//@PropertySource(value = {"classpath:person.properties"})
@PropertySource(value = {"classpath:person.yml"}, factory = PropertySourceFactory.class)
@ConfigurationProperties(prefix = "person")
public class Person {
测试输出
5.配置文件占位符
5.1随机数
配置文件还可以编写占位符生成随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
5.2属性配置占位符
占位符获取之前配置的值,如果没有可以是用:指定默认值
上面两个的测试例子如下:修改YAML文件
person:
LAST_NaME: 法外狂徒:张三${random.uuid}
sex: 男
age: ${random.int[10,50]}
birth: 2000/01/01
map:
property: v1
form: v2
list:
- list1
- list2
Dog:
name: ${person.hello:hot}_dog
age: 2