SpringBoot配置文件
文章目录
四、配置文件
1.简介
默认:
- application.properties
- application.yml
ps:文件名固定,放在classpath:/或classpath:/config目录下
2.YAML用法
2.1 简介
YAML不是一种标记语言;
YAML是专门用来写配置文件的语言,比xml、properties更适合作为配置文件;
YAML文件的后缀是.yml或.yaml 。
2.2语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tag键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- “#” 表示注释
三种数据结构的用法
1.字面量:普通的值,字符串、数字、布尔等
number: 12.5
str: hello
name: 'tom cruise' #如果字符串包含空格或者特殊字符,则必须使用引号引起来,单引号或双引号都可以
name: 'tom \n cruise' #单引号不会对特殊字符进行转义,结果:tom 换行 cruise
name: "tom \n cruise" #对特殊字符进行转义,会作为普通字符输出
2.对象,也称为Map映射,包含属性和值
#写法1:换行写,使用缩进
user:
name: tom
age: 21
# 写法2:行内写法
user: {name: tom,age: 21}
3.数组,如List、Set等
# 写法1:换行写,使用短横线
names:
- tom
- jack
- alice
# 写法2:行内写法
names: [tom,jack,alice]
3.为属性注入值
通过添加新配置文件,为类中的属性注入值
3.1使用.yml配置文件
添加依赖(可选)
<!-- 配置文件处理器,自动生成元数据信息,编写配置文件就有提示信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.1编写.yml文件
#修改默认配置
server:
port: 8088 #写法key:value,冒号后面必须有空格
servlet:
context-path: /springboot03
user:
username: admin
age: 18
status: true
birthday: 2019/2/15
address:
province: 安徽省
city: 合肥市
lists:
- list1
- list2
- list3
maps: {k1: v1,k2: v2}
3.2也可以编写properties文件
(使用这个之前需要设置idea的编码,防止中文乱码)
#server.port=8083
#server.servlet.context-path=/cz
user.username=alice
user.age=21
user.status=false
user.birthday=2019/1/15
user.address.province=安徽省
user.address.city=合肥市
user.lists=list1,list2,list2
user.maps.k1=v1
user.maps.k2=v2
文件目录:
3.3使用@Value为属性注入值
@Value和@ConfigurationProperties的比较:
- @Value只能一个个为属性注入值,而@ConfigurationProperties可以批量为属性注入值
- @Value不支持复杂类型封装,而@ConfigurationProperties支持
4.多环境配置(开发/测试/生产)
两种方式:
1.创建多个properties文件
2.定义yml文档块
4.1创建多个properties文件
步骤:
1. 创建不同环境的properties文件
文件命名要必须符合application-xxx.properties格式
可以在其内部配置不同的端口测试。
2. 在application.properties文件中指定要激活的配置
4.2 定义文档块
---
spring:
profiles: dev
server:
port: 9991
---
spring:
profiles: test
server:
port: 9992
---
spring:
profiles: prod
server:
port: 9993
在第一个文档块中指定要激活的配置 :
5.加载外部的配置文件
5.1 加载properties属性文件
使用@PropertySource加载外部的属性文件
// 将当前Bean添加到容器中
@Component
// 加载外部的属性文件
@PropertySource({"classpath:user.properties"})
// 默认读取全局配置文件获取值,将当前类中的属性与配置文件中的user进行绑定
@ConfigurationProperties(prefix = "user")
public class User implements Serializable {
5.2 加载spring配置文件
使用@ImportResoruce加载外部的Spring的XML文件
ps:除非必要,否则不建议写xml文件
// 加载外部的spring配置文件
@ImportResource({"classpath:spring.xml"})
@SpringBootApplication
public class Springboot03ConfigApplication {
5.3使用注解方式添加组件
使用@Configuration和@Bean
//标注在类上,表示这是一个配置类,相当于以前编写的Spring配置文件
@Configuration
public class SpringConfig {
//标注在方法上,向容器中添加一个组件,将方法的返回值添加到容器中
@Bean
public Address address(){
Address address=new Address();
address.setProvince("安徽");
address.setCity("合肥");
return address;
}
}
五、自动配置的原理
1.执行流程
-
SpringBoot应用启动时会加载主程序类,开启了自动配置功能@EnableAutoConfiguration
-
@EnableAutoConfiguration作用
利用@Import({AutoConfigurationImportSelector.class})向容器中添加一些组件(自动配置类)。
【查看AutoConfigurationImportSelector中的selectImports()方法;---->查看List configurations = this.getCandidateConfigurations(annotationMetadata, attributes)获取候选的配置;---->查看SpringFactoriesLoader.loadFactoryNames方法---->查看loadSpringFactories()方法---->查看classLoader.getResources(“META-INF/spring.factories”)加载META-INF/spring.factories】
- 简单来说就是:
扫描所有jar包类路径下的METAINF/spring.factories文件,获取到EnableAutoConfiguration对应的值(在spring-boot-autoconfigure-2.1.2.RELEASE.jar中),将这些自动配置类(xxxxAutoConfiguration)添加容器中
- 简单来说就是:
-
通过这些自动配置类完成相应的配置功能
2.原理分析
以HttpEncodingAutoConfiguration 为例,即原先在web.xml文件中配置的CharacterEncodingFilter过滤器
// 表示这是一个配置类,相当于原先编写的spring配置文件
@Configuration
// 启用HttpProperties类的ConfigurationProperties功能,通过配置文件为其属性注入值,并将其添加到容器中
@EnableConfigurationProperties({HttpProperties.class})
// 如果当前应用是Web应用,则该配置类生效,否则不生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
// 如果当前应用中有CharacterEncodingFilter类,则该配置类生效,否则不生效
@ConditionalOnClass({CharacterEncodingFilter.class})
// 如果配置文件中有spring.http.encoding.enabled选项,则该配置项生效,否则不生效,默认已经设置为True,所以默认生效
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
// 将容器中HttpEncodingProperties注入
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
} // 将方法返回值添加到容器中
@Bean
// 如果容器中没有这个组件,则添加
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
return filter;
}
#可以在yml文件中通过配置绑定某个类的属性值:
spring.http.encoding.charset=gbk
spring.http.encoding.force=true
注意:
- 根据当前不同的条件判断,决定自动配置类是否生产,即并不是所有的自动配置类都会生效
- 自动配置类xxxAutoConfiguration的属性是从对应的xxxProperties类中获取的
- xxxProperties类中的所有属性是通过配置文件注入绑定的,我们可以通过配置文件指定这些属性的值
3.总结
- SpringBoot启动时会加载大量的自动配置类(xxxAutoConfiguration)
- 通过这些自动配置类向容器中添加组件
- 通过这些组件来实现自动配置功能,简化
PS:需要完整版笔记,请评论留下邮箱,我看到后回发给你PDF完整版记录~~~
点击查看分版笔记目录:
【SpringBoot】最新版2019Spring Boot快速入门(速成SpringBoot)——学习笔记版解析【1】
【SpringBoot】最新版2019Spring Boot配置解析,源码解析(速成SpringBoot)——学习笔记版【2】
【SpringBoot】最新版2019Spring Boot之WEB开发——Thymeleaf模板引擎速成(速成SpringBoot)——学习笔记版解析【3】
【SpringBoot】最新版2019Spring Boot之MVC功能,异常处理,servlet容器(速成SpringBoot)——学习笔记版解析【4】
【SpringBoot】最新版2019Spring Boot之连接数据库——JDBC,MyBATIS,分页,MyBatisPlus(速成SpringBoot)——学习笔记版解析【5】