【SpringBoot】最新版2019Spring Boot配置解析,源码解析(速成SpringBoot)——学习笔记版【2】

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包类路径下的META­INF/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,分页,MyBatis­Plus(速成SpringBoot)——学习笔记版解析【5】

猜你喜欢

转载自blog.csdn.net/OrangeChenZ/article/details/87459478
今日推荐