- SpringBoot默认可以用两个名称作为全局配置文件
- application.properties
- application.yml
- 配置文件的作用:修改SpringBoot的默认值.
- YAML文件
- 标记语言:
- 以前的配置文件:大多使用的是xx.xml文件;
- 而yml是以数据为中心,更适合作为配置文件
- yaml:配置例子
server:
port: 8081
- xml:配置例子
<server>
<port>8081</port>
</server>
- 相比较而言,使用yaml语法编写配置信息,整体显得更加简洁,结构也更为清晰.
yml数据结构和常用写法
- 基本语法:
key(空格): value
表示一堆键值对(空格必须有)
- 以空格的缩进来控制层级关系;只要是左右对齐的一列数据,都是同一个层级的
```yml
server:
port: 8080
path: /hello
- 值的写法
- 字面量: 普通的值(数字,字符串,布尔)
k: v - 字面量直接来写,字符串默认不用加上单引号或双引号
1. 双引号: 不会被转义字符里面的特殊字符;特殊字符会作为本身表示的意思
2. 单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- 对象,Map(属性和值)(键值对)
- 对象的写法
k:
k: v
k: v
- 对象还有一种行内写法
k: {k: v,k: v......}
- 数组(list,Set);
- 数组使用"-"短横线来表示数组中每一个元素
k:
- v1
- v2
- v3
yaml配置文件值注入
- 定义一个javaBean程序类—Person
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String userName;
private Integer age;
private Map<String,Object> maps;
private List<String> animal;
private List<String> interests;
private List<Object> friends;
private List<Map<String,Object>> childs;
......
}
- @ConfigurationProperties:该注解的作用是告诉SpringBoot本类中的所有属性和配置文件中的相关配置进行绑定
- prefix = “person”,指定配置文件中的key值.
- @Component:该注解的作用是将该组件添加到SpringBoot容器中,只有称为SpringBoot组件才能够提供@ConfigurationProperties功能.
- 如果使用@ConfigurationProperties功能,还可以在导入配置文件处理器,这样在编写代码的时候会有相应的提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 在application.yml配置文件中定义"person"属性
person:
name: 'xiemaoshu'
user-name: 'admin'
age: 23
maps: {k1: v1,k2: v2,k3: v3}
animal:
- 'xiaohei'
- 'xiaobai'
interests:
- 'guitar'
- 'computer gamer'
- 'fitness'
friends:
-
- 'lanchaogou is my friend'
- "list\n"
childs:
- name: 'c1'
age: 1
- name: 'c2'
age: 2
- name: 'c3'
age: 3
- 在测试类中获取到配置文件中定义的值
- 要使用SpringBoot测试类需要添加以下的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 定义测试类,获取配置文件中的值
package mao.shu.app.entity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class PersonTest {
@Autowired
private Person person;
@Test
public void getPerson(){
System.out.println(person);
}
}
- 控制台输出内容
Person{name='xiemaoshu', userName='admin', age=23, maps={k1=v1, k2=v2, k3=v3}, animal=[xiaohei, xiaobai], interests=[guitar, computer gamer, fitness], friends=[[lanchaogou is my friend, list
]], childs=[{age=1, name=c1}, {age=2, name=c2}, {age=3, name=c3}]}
properties配置文件
- IDEA中的properties的默认编码是utf-8,而properties文件需要使用ascil编码,所以使用properties配置文件配置中文值的时候会出现乱码的情况
- 需要进行以下设置,进入settings,对 File Encoding进行设置,将"运行时将properties文件转换为auscil编码.
- 编写application.properties配置文件
person.name=xiemaoshu
person.age=23
person.user-name=admin
person.maps.k1=v1
person.maps.k2=v2
person.maps.ceshi=测试数据
person.maps.dd=测试数据
person.animal=dog,cat,fish
person.friends=lanchaog,friend
person.interests=java,game
- 测试程序类
package mao.shu.app.entity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class PersonTest {
@Autowired
private Person person;
@Test
public void getPerson(){
System.out.println(person);
}
}
- 控制台输出
Person{name='xiemaoshu', userName='admin', age=23, maps={k1=v1, dd=测试数据, ceshi=测试数据, k2=v2}, animal=[dog, cat, fish], interests=[java, game], friends=[lanchaog, friend], childs=null}
@ConfigurationProperties和@Value的区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入属性值 | 单个注入属性值 |
松散绑定 | 支持 | 不支持 |
SqEl | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
-
松散绑定指的是:在绑定属性值的时候,松散绑定可以使用"xxx_yyy"来绑定驼峰命名法的变量"xxxYyy"
-
配置文件yml还是properties他们都能获取到值;
-
如果说,我们只是在摸个业务逻辑中需要获取配置文件中的某项值,使用@Value
-
如果,专门编写了一个javaBean来和配置文件进行映射,就直接使用@ConfigurationProperties
-
使用@ConfigurationProperties注解的时候,进行JSR303进行 配置文件值校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@NotNull
private String name;
@Email
private String userName;
......
}
配置@PropertiesSource和@ImportResource
- 默认情况下SpringBoot是从全局配置文件中获取值,当我们要定义一些于SpringBoot无关的配置的时候,可以自己单独写一个配置文件,例如,将所有于Person有关的配置写在"person.properties"文件之中.
- 而后在要获取配置文件值的地方使用"@PropertiesSource"注解指定要引用的文件
2. 有时候我们会使用xml文件配置Bean的时候,要想获取到xml文件中配置的Bean的时候,可以使用"@ImportResource"注解来引入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="person2" class="mao.shu.app.entity.Person">
<property name="name" value="xiemaoshu"/>
<property name="age" value="22"/>
<property name="userName" value="admin"/>
</bean>
</beans>
- 使用@ImportResource注解来使*.xml配置文件生效
- SpringBoot推荐的给容器中添加组件的方式
- 使用配置类的方式,来添加组件
- 要定义一个配置类,可以使用@Configuration注解来定义,这个类就相当于是spring的配置文件
- 示例:
- 使用"@Bean"配置的方法,会将方法的返回值注入到Spring容器之中,容器中默认的id就是方法名
package mao.shu.app.conf;
import mao.shu.app.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class xiemaosConf {
@Bean
public Person person3(){
Person person = new Person();
person.setName("xxxxxxxxx");
person.setAge(23);
person.setUserName("aaaaaaaaa");
return person;
}
}
配置文件占位符
- 使用随机数
${random.value}、
${random.int}、
${random.long}
${random.int(10)}、
${random.int[1024,65536
- 示例:使用随机数
person.name=xiemaoshu${random.uuid}
person.age=${random.int}
- 控制台输出
Person{
name='xiemaoshub1b06310-ce66-4d92-a056-9e078e1189ec',
age=970718249,
- 配置文件设置默认值使用":"符号定义
- 示例:
person.user-name=${person.admin:xiemaos}
- 当没有找到person.admin的值的时候,就使用默认值"xiemaos"
- 控制台输出
userName='xiemaos'
Profile多环境支持
- 多Profile文件
- 在多配置文件编写的时候,文件名称可以是
application-{profile}.properties/ym
- {profile}为标识符,可以自定义
- 示例:定义多个配置文件
- application.properties
server.port=8081
- application-dev.properties
server.port=8082
- application-test.properties
server.port=8083
- 默认启动的时候使用的是application.properties配置
- 激活方式
- 命令行:
--spring.profiles.active=dev
- 在主配置文件中设置
spring.profiles.active=dev
- jvm参数
-Dspring.profiles.active=dev
- yml多文档块
- 当使用yml文件配置多环境的时候,可以定义多个文档块类定义不同的环境
- 在yml文件中使用"—"三个短横线来分割不同的文档块
server:
port: 8081
spring:
profiles:
active: #active 指定要激活配置
--- #三个短横线用于分隔多个文档块
server:
port: 8082
spring:
profiles: prod # 配置名称
---
server:
port: 8083
spring:
profiles: default # default表示默认配置,在没有指定使用某个配置的时候,默认使用该配置
- 激活指定profile
- 在配置文件中指定 spring.profiles
- 命令行:java -jar spring-boot-02-config-0.0.1可以直接在测试的时候,配置传入命令
- 虚拟机参数;-Dspring.profiles.active=d