學習springboot2的第5天(2021-12-04)13-自動配置【源碼分析】自動包規則原理
【springboot自動配置原理的入門】
springboot到底是怎麼神不知鬼不覺地幫我們做了很多事情。隻讓我們關注業務邏輯的開發。帶着這個問題開始學習。
【核心注解】:
@SpringBootApplication
這個注解一般是在啟動程式類的類體上。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO3MzM2QWMyQGOkhTYhVzNzYzX3ETOyETM3EzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
其中@SpringBootApplication這個注解等同于:下面三個注解(1=3)
1、@SpringBootConfiguration
2、@ComponentScan
3、@EnableAutoConfiguration
首先将第一個注解@SpringBootConfiguration
發現注解@SpringBootConfiguration它就是一個配置的注解。
之前學習過。
代表目前這個MainApplication類也是springboot的一個配置類。
2、@ComponentScan
這個注解就是包掃描。
【這個詳細知識在學習spring的視訊裡面有詳細講解ComponentScan 】
3、@EnableAutoConfiguration(核心注解)
這個注解很重要。
這個注解是由
1、@AutoConfigurationPackage
2、@Import({AutoConfigurationImportSelector.class})
這兩個注解合成的。
3.1、@AutoConfigurationPackage
發現注解@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));
}
}
發現它有兩個方法:
利用Registrar給容器批量注冊一系列元件。
因為如果是Import一個個導入元件太麻煩。
是以:@AutoConfigurationPackage注解是利用類Registrar批量導入元件。
問:哪一系列的元件呢?
看源碼:
Registrar類裡面的方法1的參數1:
AnnotationMetadata metadata
注解的中繼資料資訊。
這個注解就是AutoConfigurationPackage
是以第一個參數(AnnotationMetadata metadata)就是:
注解AutoConfigurationPackage的中繼資料資訊,這個注解标在哪裡?它的每一個屬性值都是什麼?
那注解AutoConfigurationPackage是标在哪裡了呢?
關系是這樣的:
是以:
注解AutoConfigurationPackage是标在EnableAutoConfiguration注解上。
而 EnableAutoConfiguration注解是标注在SpringBootApplication
而SpringBootApplication标注在com.rtl.boot.MainApplication類上面。
是以我們在debug的時候:
解釋這段代碼:
加入我們想看一下這段代碼執行之後的結果:
new PackageImports(metadata).getPackageNames()
選中這段代碼,然後右鍵:
得到的結果:
為什麼是這個報名呢?
因為這個注解标注在這個MainApplication上。
這個類的全類名是:com.rtl.boot.MainApplication
然後把這個包名封裝在數組裡面。然後注冊進去。