0%

SpringBoot——配置文件

  • 配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好了

application.properties全局配置文件&yml配置文件

SpringBoot的配置文件

1、yml以数据为中心,比json和xml更适合做数据型配置文件,如yml文件的基本语法如下

  1. 以k:v来表示一对键值对(在:后面必须加空格)。

  2. 以空格的缩进来控制层级关系,只要左对齐的一列数据,都是属于同一层级的。

  3. 属性和值是严格区分大小写。

2、值的写法:都是可以用k:v的形式来写

  1. 数字、字符串、布尔值: 直接写

  2. 数组: 数组可以使用行内写法:list: [a,b,c]

  3. 对象、Map():对象可以使用行内写法:

person: {name:xxx, age:xxx, sex:xxx, ...}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
port: 8888
spring:
profiles:
active: dev
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles:prod
#person:
# name: 陈哲凯
# age: 23
# sex: true
# birth: 1998/08/29
# list:
# - "first"
# - "second"
# - "third"

yml配置文件值的获取

  • @ConfigurationProperties(prefix = “配置文件中的配置数据值”),即可将配置文件中配置的每一个属性的值都映射到带有这个注解的组件类中
1
2
3
4
5
6
7
8
9
10
//在类定义前必须加上@Component来标注这个类是一个组件,只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private boolean sex;
private Date birth;
private List<String> list;
}
  • 在组件类定义的前面加@ConfigurationProperties注解可以将组件类的所有属性和配置文件中相关的配置进行绑定

@ConfigurationProperties和@Value的区别

  • @Value是加在类的属性之前,和@ConfigurationProperties一样,能将配置文件的数据和属性绑定起来,也能在组件类中指定值,但@Value只能绑定一个属性,使用的形式:@Value(“…”)
1
2
3
4
5
6
7
8
9
10
11
12
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
@Value("${person.name}")
private String name;
@Value("#{11*2}")
private int age;
@Value("false")
private boolean sex;
@Value("${person.birth}")
private Date birth;
private List<String> list;
  • 区别:
- @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定 支持 不支持
表达式 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • 如果只是在某个业务逻辑中需要获取一个配置文件中的某项值,使用@Value;如果专门编写了一个JavaBean来和配置文件进行映射,就直接使用@ConfigurationProperties

@PropertySource

  • 加载指定的配置文件
  • @ConfigurationProperties默认是加载application.properties全局配置文件,而@PropertySource可以加载指定的配置文件
  • 例如,在Person类定义的前面加上@PropertiesSource(value = {“classpath:person.properties”}),Person类就会加载resources目录下的person.properties,将配置文件的数据绑定到类的属性中

@ImportResource

  • 导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效、加载起来,就需要把@ImportResource标注在一个配置类上。

  • SpringBoot推荐给容器中添加组件的方式:使用全注解的方式

1、配置类=====Spring配置文件,在SpringBootApplication类中使用@ImportResource注解指定配置文件的路径

1
2
3
4
5
6
7
8
9
@ImportResource(locations = {"classpath:bean.xml"})
@SpringBootApplication
public class SpringBoot01HelloworldQuickApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBoot01HelloworldQuickApplication.class, args);
}

}

2、使用@Bean给容器中添加组件(推荐方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
* @Configuration指明当前类是一个配置类,就是来代替之前的Spring配置文件
* 之前在配置文件中用<bean><bean/>标签添加组件
* 现在可以在配置类中使用@Bean注解来添加组件
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService(){
System.out.println("配置类@Bean给容器中添加组件了....");
return new HelloService();
}
}

配置文件占位符

1、随机数

  • 形式:${random.value},value可以是int、int(n)、long和int[n, m](n到m的随机数)等等。

2、占位符获取之前配置的值,若没有可以用指定的默认值

  • 形式:${之前配置的值对应的key}

Profile

1、多Profile文件

  • 我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml,默认使用application.properties,可以在默认配置文件中用spring.profiles.active=xxx来激活使用的配置文件,例如在application.properties下写spring.profiles.active=dev,Spring就会使用application-dev.properties作为它的配置文件,这样就可以灵活地在多个环境下的不同配置信息进行切换。
1
spring.profiles.active=dev
1
server.port=8081

1、yml多文档块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#默认的配置(文档块一)
server:
port: 8888
#在这里激活使用哪个文档块
spring:
profiles:
active: prod
# 多个文档块间使用'---'进行分隔
---
# 文档块二
server:
port: 8081
spring:
profiles: dev
---
# 文档块三
server:
port: 8082
person:
name: 张三
age: 20
sex: true
list:
- a
- b
- c
birth: 2000/01/01

激活指定的profile方式

  1. spring.profiles.active=xxx来激活配置

  2. 在EditConfiguration设置里面点开SpringBoot先选定你想要设置的项目,然后修改Active profiles选项,即可修改profile配置。

  3. 命令行方式:java -jar spring-boot-01-helloworld-quick-0.0.1-SNAPSHOT.jar –spring.profiles.active=dev直接在命令行传入参数指定profile


配置文件加载的位置

1、内部配置文件加载位置

SpringBoot配置文件加载位置

2、外部配置文件加载顺序

SpringBoot外部配置加载顺序1

SpringBoot外部配置加载顺序2

SpringBoot外部配置加载顺序3


自动配置原理

配置文件到底能写什么?怎么写?

配置文件能配置的属性参照

1、原理

  1. SpringBoot启动的时候加载主配置类,开启自动配置功能@EnableAutoConfiguration

  2. @EnableAutoConfiguration的作用:

  • 使用AutoConfigurationImportSelector给容器中导入一些组件

  • AutoConfigurationImportSelector使用List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);来获取候选的配置

  • getCandidateConfigurations使用了SpringFactoriesLoader来将类路径下的”META-INF/spring.factories”EnableAutoConfiguration里面所有的配置的值加入到容器中,每一个xxxAutoConfiguration类都是容器中的一个组件,它们都会进行一个自动配置(自动配置功能),然后加入到容器中

Library
1
2
3
4
5
6
7
8
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
......总共有一百多个组件
  • 下面以HttpEncoding的自动配置原理来进行讲解:

HttpEncodingAutoConfiguration

Conditional派生注解和自动配置报告

1、Conditional派生注解

Conditional派生注解

2、自动配置报告

  • 可以在配置文件中设置debug的值来让springboot生成自动配置报告,即写上debug=true(默认为false)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
============================
CONDITIONS EVALUATION REPORT
============================

//启动的自动配置类
Positive matches:
-----------------

AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)

AopAutoConfiguration.ClassProxyingConfiguration matched:
- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
......
//没有启动的自动配置类
Negative matches:
-----------------

ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

AopAutoConfiguration.AspectJAutoProxyingConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition)
......
  • 在使用自动配置类属性时的精髓:

使用自动配置的精髓


参考视频:B站
感谢观看

-------------本文结束感谢您的阅读-------------