Spring Boot 自动化配置原理带图全面讲解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 自动化配置原理带图全面讲解相关的知识,希望对你有一定的参考价值。
参考技术A # Spring Boot 自动化配置原理> 我们经常使用Spring Boot,是否知道Spring Boot自动化配置是怎么实现的呢?
<a name="iM87x"></a>
## 一 初识自动化配置
Spring Boot自动化配置依赖于@EnableAutoConfiguration注解<br />该注解会在@SpringBootApplication中包含<br />该注解为一个复合注解包含了以下注解<br />@SpringBootConfiguration 标识该类是一个配置类<br />@EnableAutoConfiguration 开启自动化配置<br />@ComponentScan 扫描该类下的所有包配置的bean<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605766349305-e5b2ae88-5100-4f06-9012-359fb970484b.png#align=left&display=inline&height=233&margin=%5Bobject%20Object%5D&name=&originHeight=466&originWidth=916&size=60525&status=done&style=none&width=458)
<a name="TI8GH"></a>
## 二 揭开自动化配置面纱
**@EnableAutoConfiguratio**n 今天我们主要关注的是这个注解 <br />此注解为一个复合注解包含了<br />**@AutoConfigurationPackage **<br />该注解会导入一个**AutoConfigurationPackages**类<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605774036383-146af0c9-a623-4b10-8b73-07c4b649c5b4.png#align=left&display=inline&height=227&margin=%5Bobject%20Object%5D&name=&originHeight=454&originWidth=1019&size=50537&status=done&style=none&width=509.5)<br />**该方法****将主程序类所在包及所有子包下的组件到扫描到spring容器中完成****项目包下组件的自动注册**
> **至此我们完成了自动化配置中自己的组件的自动化配置,那么我们依赖的jar包自动化配置说怎么实现的呢,请继续往下看**
![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605775088571-79912d2c-5d1d-4d65-969c-85d29fdbf315.png#align=left&display=inline&height=299&margin=%5Bobject%20Object%5D&name=&originHeight=598&originWidth=1814&size=127855&status=done&style=none&width=907)<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605775171339-f9ee7973-5264-4bcc-9296-d6dfcf93d278.png#align=left&display=inline&height=284&margin=%5Bobject%20Object%5D&name=&originHeight=568&originWidth=1003&size=78791&status=done&style=none&width=501.5)
<a name="mz1Pw"></a>
## 三 深入自动化配置
**我们继续回到****EnableAutoConfiguration****注解 **<br />**![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605777120808-058819b5-b772-4c66-a500-640a2bb839da.png#align=left&display=inline&height=374&margin=%5Bobject%20Object%5D&name=&originHeight=749&originWidth=733&size=64165&status=done&style=none&width=366.5)**
<a name="iHhrI"></a>
### 该注解包含2个属性:
exclude:根据类排除不使用的自动配置;<br />excludeName:根据类名排除不使用的自动配置;<br />并导入了**AutoConfigurationImportSelector**类 该类的核心方法为**getCandidateConfigurations**通过该方法即可获取到(spring-boot-2.1.3.RELEASE.jar/META-INF/spring.factories) 下的配置文件,该文件为spring boot自动化配置的配置文件,至此我们获取到的是所有的自动化配置类,那么spring boot的按需导入是怎么实现的呢,请继续往下看<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776345938-dfe94697-90f9-4c97-97d9-c557f5ca3a1f.png#align=left&display=inline&height=328&margin=%5Bobject%20Object%5D&name=&originHeight=655&originWidth=1284&size=93261&status=done&style=none&width=642)<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776688829-6f621201-ffda-419d-bb1c-f36d6d314ee3.png#align=left&display=inline&height=424&margin=%5Bobject%20Object%5D&name=&originHeight=848&originWidth=1668&size=180815&status=done&style=none&width=834)<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776722465-56b97643-9223-4bcc-b05c-d4a40031ec43.png#align=left&display=inline&height=437&margin=%5Bobject%20Object%5D&name=&originHeight=873&originWidth=1573&size=201935&status=done&style=none&width=786.5)<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605777393268-9c7a8c52-9e1e-4665-999a-44a68b5bffff.png#align=left&display=inline&height=239&margin=%5Bobject%20Object%5D&name=&originHeight=478&originWidth=1038&size=95520&status=done&style=none&width=519)<br /><br />因为spring boot是按需配置所以我们还需要根据引入的依赖筛选出需要的配置,核心方法如下
```java
protected AutoConfigurationEntry getAutoConfigurationEntry(
AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata)
//判断是否开启自动配置
if (!isEnabled(annotationMetadata))
return EMPTY_ENTRY;
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//获取自动配置文件和配置
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
//删除重复项
configurations = removeDuplicates(configurations);
//获取排除的自动化配置
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
//检查排除的自动化配置
checkExcludedClasses(configurations, exclusions);
//移除排除的自动化配置
configurations.removeAll(exclusions);
//根据引入的依赖按需导入自动配置
configurations = filter(configurations, autoConfigurationMetadata);
//触发自动化配置
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
```
filter方法会过滤我们的自动化配置类 ,规则是根据我们配置类上的 @Conditiona系列注解<br />![](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605779980417-f5d8e3cc-3a9e-4dac-bc3e-328d40b8b9eb.png#align=left&display=inline&height=246&margin=%5Bobject%20Object%5D&name=&originHeight=491&originWidth=1254&size=80896&status=done&style=none&width=627)
> @Conditiona系列注解含义,将在明天给大家讲解,明天会做一个自动配置的例子 希望大家关注一下
以上是关于Spring Boot 自动化配置原理带图全面讲解的主要内容,如果未能解决你的问题,请参考以下文章
[Spring Boot] 4. Spring Boot实现自动配置的原理