五SpringBoot2核心技术——自动配置原理入门

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五SpringBoot2核心技术——自动配置原理入门相关的知识,希望对你有一定的参考价值。

一、自动配置原理入门

1.1、引导加载自动配置类

  • 创建一个新的SpringBoot Web新项目;
    在这里插入图片描述
  • 打开项目中Main入口,可以看到这个类用了一个注解;
    @SpringBootApplication
package com.xbmu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {

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

在这里插入图片描述

重点来了,这里Import了一个类:AutoConfigurationImportSelector.class;
程序会通过这个类里面的selectImports方法,层级关系如下图:

AutoConfigurationImportSelector 使用了 --->
selectImports方法
调用--->
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
调用--->
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
通过以下程序--->
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());
中通过--->
loadFactoryNames方法调用了loadSpringFactories方法
该方法通过--->
Enumeration urls = classLoader.getResources("META-INF/spring.factories");
  • 我们发现程序的底层扫描了一个文件叫:META-INF/spring.factories
    程序会把所有jar下的这个文件都进行扫描,然后装配成properties对象,然后从该对象中加载:EnableAutoConfiguration.class所对应的值。然后把这些值加载到容器中去。这些值就是各种自动配置的组件类,不同的组件负责不同功能的自动配置。
    我们找到有EnableAutoConfiguration这个类的spring.factories文件,如下图,打开这个文件,我们可以找到这个类以及其他所有的属性,如二图
    在这里插入图片描述
    在这里插入图片描述

这里我们截图只拿了一部分,其实他有很多组件。希望大家可以自己去找到了解一下.每一个这样的类都是容器中的一个组件,都加入到容器中.用来做自动配置.这些类就是自动配置的开始.每一个自动配置类来自动配置自己所负责的内容.

1.2、举例说明

以HttpEncodingAutoConfiguration 这个自动配置类为例进行分析:
在这里插入图片描述
我们打开这个类,看它都有什么注解,以及这些注解都是什么意思

// 表示这是一个注解类
@Configuration(proxyBeanMethods = false)
// 启动ServerProperties的ConfigurationProperties功能
@EnableConfigurationProperties(ServerProperties.class)
// Spring底层的注解。根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效。目前是判断当前应该是否为WEB应用。
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
// 判断当前项目有没有这个类<这个类是SpringMVC中用于处理乱码的过滤器>
@ConditionalOnClass(CharacterEncodingFilter.class)
// 判断配置文件中是否存在括号内的配置
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
	...
}

上面第二个注解:
// 启动ServerProperties的ConfigurationProperties功能
@EnableConfigurationProperties(ServerProperties.class)
打开后面括号内的类.如下图.

// 该注解就是把该类中的属性与配置类中所配置的值进行映射绑定.
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
	...
}

1.3、总结:

1.3.1、@SpringBootConfiguration

// 代表当前类是一个配置类
@Configuration
@Indexed
public @interface SpringBootConfiguration {
	...
}

1.3.2、@ComponentScan

指定扫描那些,是spring注解。

1.3.3、@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
	...
}

1.3.3.1、@AutoConfigurationPackage

自动配置包?指定了默认的包规则

//给容器中导入一个组件
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
	...
}

利用Registrar给容器中导入一系列组件
将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

1.3.3.2、@Import(AutoConfigurationPackages.Registrar.class)

1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List> loadSpringFactories(ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.5.0.jar包里面也有META-INF/spring.factories
在这里插入图片描述

以上是关于五SpringBoot2核心技术——自动配置原理入门的主要内容,如果未能解决你的问题,请参考以下文章

九SpringBoot2核心技术——web开发(静态资源配置原理)

九SpringBoot2核心技术——web开发(静态资源配置原理)

八SpringBoot2核心技术——web开发(静态资源访问)

八SpringBoot2核心技术——web开发(静态资源访问)

我是如何做到springboot自动配置原理解析

我是如何做到springboot自动配置原理解析