天天看點

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

【springboot自動配置原理的入門】

springboot到底是怎麼神不知鬼不覺地幫我們做了很多事情。隻讓我們關注業務邏輯的開發。帶着這個問題開始學習。

【核心注解】:

@SpringBootApplication

這個注解一般是在啟動程式類的類體上。

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

其中@SpringBootApplication這個注解等同于:下面三個注解(1=3)

1、@SpringBootConfiguration

2、@ComponentScan

3、@EnableAutoConfiguration

首先将第一個注解@SpringBootConfiguration

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

發現注解@SpringBootConfiguration它就是一個配置的注解。

之前學習過。

代表目前這個MainApplication類也是springboot的一個配置類。

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

2、@ComponentScan

這個注解就是包掃描。

【這個詳細知識在學習spring的視訊裡面有詳細講解ComponentScan 】

3、@EnableAutoConfiguration(核心注解)

這個注解很重要。

這個注解是由

1、@AutoConfigurationPackage

2、@Import({AutoConfigurationImportSelector.class})

這兩個注解合成的。

3.1、@AutoConfigurationPackage

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

發現注解@AutoConfigurationPackage其實就是Import

就是給容器導入元件:@Import({Registrar.class})

這個元件就是Registrar.class

這個Registrar.class元件的作用是什麼呢?

點選看Registrar類的代碼:

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
      register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
    }

    @Override
    public Set<Object> determineImports(AnnotationMetadata metadata) {
      return Collections.singleton(new PackageImports(metadata));
    }

  }      

發現它有兩個方法:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

利用Registrar給容器批量注冊一系列元件。

因為如果是Import一個個導入元件太麻煩。

是以:@AutoConfigurationPackage注解是利用類Registrar批量導入元件。

問:哪一系列的元件呢?

看源碼:

Registrar類裡面的方法1的參數1:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

AnnotationMetadata metadata

注解的中繼資料資訊。

這個注解就是AutoConfigurationPackage

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

是以第一個參數(AnnotationMetadata metadata)就是:

注解AutoConfigurationPackage的中繼資料資訊,這個注解标在哪裡?它的每一個屬性值都是什麼?

那注解AutoConfigurationPackage是标在哪裡了呢?

關系是這樣的:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理
學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理
學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理
學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

是以:

注解AutoConfigurationPackage是标在EnableAutoConfiguration注解上。

而 EnableAutoConfiguration注解是标注在SpringBootApplication

而SpringBootApplication标注在com.rtl.boot.MainApplication類上面。

是以我們在debug的時候:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

解釋這段代碼:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

加入我們想看一下這段代碼執行之後的結果:

new PackageImports(metadata).getPackageNames()      

選中這段代碼,然後右鍵:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理
學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

得到的結果:

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理

為什麼是這個報名呢?

因為這個注解标注在這個MainApplication上。

這個類的全類名是:com.rtl.boot.MainApplication

然後把這個包名封裝在數組裡面。然後注冊進去。

學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理