二、配置文件
2.1 配置文件
SpringBoot使用一个全局配置文件,配置文件名是<font color="red">固定</font>的
application.properties
application.yml
- 作用:由于SpringBoot在底层已经帮助我们自动配置了,而配置文件则帮助修改SpringBoot自动配置的默认值。
2.2 YAML语法
2.2.1 基本语法
k: v
:表示一对键值对(空格必须有)- 以空格的缩进来控制层级关系,只要左对齐的一列数据,都是同一个层级的
- 属性和值都是大小写敏感的
person:
name: 张帅
age: 18
birth: 1998/12/01
boss: false
friends:
- 张三
- 李四
- 王五
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
2.2.2 值的写法
2.2.2.1 普通的值(数字、字符串、布尔)
k: v
:字面直接来写字符串默认不用加上单引号或双引号
""
:双引号,不会转义(有特殊)字符串里面的特殊字符;特殊字符会作为本身想表示的意思name: "zhangsan \n lisi"
:输出为zhangsan 换行 lisi
''
:单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据name: 'zhangsan \n lisi'
:输出为zhangsan \n lisi
2.2.2.2 对象、Map(属性和值、键值对)
- 对象还是
k: v
的方式
person:
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
- 行内写法
pet: {name: doggy, age: 2}
2.3 配置文件注入
- 配置文件:
application.yaml
person:
name: 张帅
age: 18
birth: 1998/12/01
boss: false
friends:
- 张三
- 李四
- 王五
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
- javaBean:
Person
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component //注解表明一个类会作为组件类,并告知Spring要为这个类创建bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date birth;
private boolean boss;
private List<String> friends;
private Map<String, String> map;
private Dog pet;
@Component
和@Bean
的区别@Component
注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。@Bean
注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
- 在pom文件中添加依赖,编写配置就会有提示
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.3.1 @Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
yml和properties文件都能获取到值
- 如果只需要获取配置文件中的某个单个的值,使用
@Value
- 如果专门编写了javaBean来和配置文件进行映射,使用
@ConfigurationProperties
- 如果只需要获取配置文件中的某个单个的值,使用
2.3.2 配置文件注入值数据校验 @Validated
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
//lastName必须是邮箱格式
@Email
//@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;
- 加入
@Validated
注解后,可以使用格式注解,对注入的数据进行校验
2.3.3 @PropertySource/@ImportResource/@Bean
@PropertySource
:加载指定的配置文件
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date birth;
private boolean boss;
private List<String> friends;
private Map<String, String> map;
private Dog pet;
person.name=张三
person.age=18
person.boss=false
person.birth=1998/2/5
person.friends=a,b,c
person.map.k1=v1
person.map.k2=v2
person.pet.name=doggy
person.pet.age=2
@ImportResource
:导入spring的配置文件,让配置文件中的内容生效,且必须标注砸一个<font color="red">配置类</font>上(@Configuration
)
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBootPrac02Application {
<!--bean.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.ruki.springboot.service.HelloService"></bean>
</beans>
SpringBoot推荐使用全注解方式给容器添加组件
@Configuration
配置类:Spring配置文件@Bean
给容器中添加组件
/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>标签添加组件
*
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
2.4 配置文件占位符
2.4.1 随机数
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
2.4.2 获取之前配置的值
- 如果没有可以指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
2.5 Profile
实际开发中存在多种环境
dev
:开发prod
:生产test
:测试
2.5.1 多profile文件
因此主配置文件会随着不同的生产环境而产生多个文件
application-{profile}.properties
2.5.2 yml支持多文档块的方式
- 使用三条短线
---
分隔文档块
server:
port: 8081
spring:
profiles:
active: prod #激活prod生产环境,因此端口为8084
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
2.5.4 激活指定profile
- 在配置文件中指定
spring.profiles.active=dev
- 命令行:在最后加上
--spring.profiles.active=dev
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
- 虚拟机参数 vmoption:
-Dspring.profiles.active=dev
2.6 配置文件加载顺序
- springboot启动会扫描一下位置的
application.properties
或application.yml
文件作为默认配置文件
位置 | 描述 | 优先级 |
---|---|---|
file:./config/ | 工程项目/config | 高 |
file:./ | 工程项目 | 较高 |
classpath:/config/ | resources/config | 较低 |
classpath:/ | resources | 低 |
- 优先级由高到底,高优先级的配置会覆盖低优先级的配置;
- SpringBoot会从这四个位置全部加载主配置文件;<font color="red">互补配置</font>;
2.7 外部配置加载顺序
<font color="red">SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置</font>
命令行参数:所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
- 多个配置用空格分开; --配置项=值
- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
<font color="red">由jar包外向jar包内进行寻找;</font>
<font color="red">优先加载带profile</font>
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
<font color="red">再来加载不带profile</font>
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;