五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开发(静态资源访问)