SpringBoot--配置文件
- 1. SpringBoot配置文件简介
- 2. YAML语法简单描述
- 3. 配置文件多种注入方法
- 4. 注解分析@PropertySource&@ImportResource&@Bean
- 6. Profile文件详解
- 6. 配置文件加载位置
- 7. 外部配置加载顺序
- 8. Github源码地址
1. SpringBoot配置文件简介
配置文件的作用:修改SpringBoot自动配置的默认值;共分文两类
- application.properties
- application.yaml
application.properties格式
server.port=8088
现在使用application.yaml格式
server:
port: 8081
以前使用XML
<server>
<port>8088</port>
</server>
2. YAML语法简单描述
- Key:[空格]Value:表示一对键值对(空格必须有);
- 只要是左对齐的一列数据,都是同一个层级的。
- 属性和值也是大小写敏感。
- 下例:服务的端口号
server:
port: 8088
3. 配置文件多种注入方法
- 使用注解进行批量导入@ConfigurationProperties
- @Component和@ConfigurationProperties一起使用
- 只有这个组件时容器的组件,才能使用容器提供的@ConfigurationProperties功能
导入关键的配置依赖
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
定义一个实体类Person
/**
* @ConfigurationProperties: 告诉SpringBoot将Spring中的所有属性和配置文件相关的配置进行绑定
* prefix = "person" 配置文件中哪个下面的属性进行一一映射
* 只有这个组件时容器的组件,才能使用容器提供的@ConfigurationProperties功能
* @ConfigurationProperties 默认从全局配置文件中获取值
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
Dog简单实体类
public class Dog {
private String name;
private Integer age;
}
创建application.yaml文件
server:
port: 8088
person:
name: 戏子
age: 18
happy: true
birth: 2000/1/3
maps: {k1: 戏子,k2: 20}
lists:
- 国庆节
- 中秋节
dog:
name: 旺财
age: 5
测试效果
/**
* SpringBoot单元测试
* 可以在测试期间方便进行自动注入等容器
*
*/
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
private Dog dog;
@Autowired
private Person person;
@Autowired
ApplicationContext ioc;
@Test
void testPerson() {
System.out.println(person);
}
@Test
void testDog(){
System.out.println(dog);
}
注释 application.yaml 测试properties 格式
application.properties配置文件
占位符
server.port=8088
person.name=戏子66 ${random.uuid}
person.age=19
person.birth=2000/1/3
person.happy=false
person.maps.k1=戏子1
person.maps.k2=戏子2
person.lists=a,b,c
#person.dog.name=${person.name}_dog
#如果没有值,使用默认值
person.dog.name=${person.name22: xizi}_dog
person.dog.age=1
当同时使用yaml和properties时,yaml优先运行
优先级:加载顺序是yml>yaml>properties
查看源码
配置文件的占位符
1. 随机数
${random.uuid}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2. 占位符获取之前配置的值,如果没有可以是用:指定默认值
application.properties 文件中已使用,测试结果已有
使用@Value注解逐个导入
这里用Dog实例说明 @Value各种属性测试
@Component
@Validated //校验注解
//@ConfigurationProperties //支持JSP303校验
public class Dog {
@Email //必须时邮箱格式
@Value("${person.dog.name}")
// @Value("旺财")
private String name;
// @Value("3")
@Value("#{11*2}") //支持SpEL
private Integer age;
测试
//在SpringBoot单元测试里添加方法
@Test
void testDog(){
System.out.println(dog);
}
测试邮箱校验 @Value不支持JSP303校验
@ConfigurationProperties 支持校验
@Configuration和@Value 两个注入的总结
Name |@Configuration| @Value
- | :-: | -:
功能 | 批量注入配置文件中的属性| 一个个指定
SpEL | 不支持 | 支持
JSR303数据校验 | 支持 |不支持
复杂类型封装 |支持 |不支持
4. 注解分析@PropertySource&@ImportResource&@Bean
@PropertySource
@PropertySource:加载指定的配置文件;
创建一个配置文件 xizi.properties
#spring Booot 里面没有Spring的配置文件,自己编写的配置文件不能自动识别
#使用@ImportResource注解 加载配置文件 生效 标注在配置类上
person.name=xizi777
person.age=19
person.birth=2000/1/3
person.happy=false
person.maps.k1=xizi1
person.maps.k2=xizi2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=1
测试结果
@ImportResource 在运行类上加注解
创建一个beas.xml 文件 注入Service层的HelloService类
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.xizi.service.HelloService">
</bean>
</beans>
SpringBoot单元测试 查看注入的bean是否成功
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService(){
boolean helloService = ioc.containsBean("helloService");
System.out.println(helloService);
}
@Bean SpringBoot官方推荐使用的配置
创建自定义的configuration类 注释@ImportResource注解
package com.xizi.config;
import com.xizi.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration: 指明当前类是一个配置类,代替之前的Spring配置文件
* 在配置文件中使用<bean></bean> 标签添加组件
* */
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中
//组件中默认的id就是方法名
@Bean
public HelloService helloService(){
return new HelloService();
}
}
测试
6. Profile文件详解
配置的文件名可以是 application-[profile].properties/yaml
默认使用application.properties的配置;
- 第一种application.properties里修改,创建多个配置文件
- 创建一个dev和prod 环境配置文件 改变端口号
- 使用spring.profiles.active 激活其他配置文件
- 不激活,默认使用application.properties文件配置
- 测试我就不放了
- 第二种使用yaml文档块的模式 进行多文件配置
#使用yaml文档块的模式 进行多文件配置
server:
port: 8088
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
激活指定的profile
- 在配置文件中指定 spring.profiles.active=dev
- 将项目打包,使用终端命令进行运行 加上参数
java -jar XXX.jar --spring.profiles.active=dev; - 虚拟机参数;
-Dspring.profiles.active=dev - Program arguments: --spring.profiles.active=dev
测试虚拟机参数
6. 配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- –file:./config/
- –file:./
- –classpath:/config/
- –classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
测试优先级 1234从高到底加载端口号测试
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
在优先级最低的application.properties加入项目访问路径名
server.port=8081
#SpringBoot在2.0版本之后已经弃用server.context-path
server.servlet.context-path=/boot002
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
在D盘下面创建一个application.properties的配置文件 编写server.port=8090
java -jar springboot-config-test-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
直接在IDEA中打开终端命令行
7. 外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
- 命令行参数:所有的配置都可以在命令行上进行指定
多个配置用空格分开; --配置项=值
多个参数的运行- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
优先加载带profile
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
测试 一个jar外部的appliction.properties配置文件