Spring Boot 自动化配置原理带图全面讲解

# Spring Boot 自动化配置原理

> 我们经常使用Spring Boot,是否知道Spring Boot自动化配置是怎么实现的呢?

<a name="iM87x"></a>

## 一 初识自动化配置

Spring Boot自动化配置依赖于@EnableAutoConfiguration注解<br />该注解会在@SpringBootApplication中包含<br />该注解为一个复合注解包含了以下注解<br />@SpringBootConfiguration 标识该类是一个配置类<br />@EnableAutoConfiguration 开启自动化配置<br />@ComponentScan 扫描该类下的所有包配置的bean<br />![image.png](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=image.png&originHeight=466&originWidth=916&size=60525&status=done&style=none&width=458)

<a name="TI8GH"></a>

## 二 揭开自动化配置面纱

**@EnableAutoConfiguratio**n 今天我们主要关注的是这个注解 <br />此注解为一个复合注解包含了<br />**@AutoConfigurationPackage **<br />该注解会导入一个**AutoConfigurationPackages**类<br />![image.png](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=image.png&originHeight=454&originWidth=1019&size=50537&status=done&style=none&width=509.5)<br />**该方法****将主程序类所在包及所有子包下的组件到扫描到spring容器中完成****项目包下组件的自动注册**

> **至此我们完成了自动化配置中自己的组件的自动化配置,那么我们依赖的jar包自动化配置说怎么实现的呢,请继续往下看**

![image.png](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=image.png&originHeight=598&originWidth=1814&size=127855&status=done&style=none&width=907)<br />![image.png](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=image.png&originHeight=568&originWidth=1003&size=78791&status=done&style=none&width=501.5)

<a name="mz1Pw"></a>

## 三 深入自动化配置

**我们继续回到****EnableAutoConfiguration****注解 **<br />**![image.png](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=image.png&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 />![image.png](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=image.png&originHeight=655&originWidth=1284&size=93261&status=done&style=none&width=642)<br />![image.png](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=image.png&originHeight=848&originWidth=1668&size=180815&status=done&style=none&width=834)<br />![image.png](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=image.png&originHeight=873&originWidth=1573&size=201935&status=done&style=none&width=786.5)<br />![image.png](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=image.png&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 />![image.png](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=image.png&originHeight=491&originWidth=1254&size=80896&status=done&style=none&width=627)

> @Conditiona系列注解含义,将在明天给大家讲解,明天会做一个自动配置的例子 希望大家关注一下

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容