深入SpringBoot自動配置原理解析,一步步深入與理解

SpringBoot自動配置原理解析

本文將從一個最簡單的web應用程序來分析springboot的自動配置原理。

1.下面是springboot的啓動程序,標註了@SpringBootApplication註解,說明當前是一個Springboot程序
在這裏插入圖片描述2.我們點擊@SpringBootApplication註解,進入其內部。
在這裏插入圖片描述如上圖紅圈所示,@SpringBootConfiguration表示當前類是一個Springboot的配置類;@EnableAutoConfiguration表示開啓自動配置功能。

我們還可以進入到@SpringBootConfiguration註解內部,其依賴的是spring的@Configuration註解。

3.探究@EnableAutoConfiguration註解,進入@EnableAutoConfiguration內部

在這裏插入圖片描述
如上圖所示,主要依賴了兩個註解@AutoConfigurationPackage和@Import。

3.1@AutoConfigurationPackage:該註解的主要作用是將主配置類(@SpringBootApplication標註的類)所在包及下面所有子包裏面的所有組件掃描到Spring容器;

繼續深入@AutoConfigurationPackage內部,我們看看是如何將相關類掃描到Spring容器的。
在這裏插入圖片描述
在@AutoConfigurationPackage內部使用了,其實@Import註解的作用就是導入組件。

我們進入AutoConfigurationPackages.Registrar,發現它是一個靜態內部類。
在這裏插入圖片描述
該內部類有一個方法名爲"註冊Bean的定義",好像是說這個方法能夠相關的Bean定義掃描的Spring容器中。打一個斷點看看,到底註冊了什麼東西。

在這裏插入圖片描述通過斷點處的分析,可以看到通過new PackageImport(metadata).getPackageName()方法,計算出了一個結果:com.atguigu,這是我Springboot主程序所在的包。也就是說,這裏將Springboot主程序所在包以及其子包的所有內容都註冊到Springboot容器中了。

3.2@Import(EnableAutoConfigurationImportSelector.class)
通過上面我們知道,@Import的功能是導入組件,我們進入到導入的組件內部,看看該組件的作用。

在這裏插入圖片描述
EnableAutoConfigurationImportSelector繼承了AutoConfigurationImportSelector,我們再進入它的父類。
在其父類AutoConfigurationImportSelector中有如下方法,該方法用於導入相關的組件,這些組件會被添加到容器中。

在這裏插入圖片描述通過源代碼可知,最後將configurations集合轉爲數組返回了,所以該集合應該是存儲了導入組件的信息。
我們通過斷點的方式查看到底導入了哪些組件。

可以看到configurations集合大小爲96,存儲大量的與自動配置相關的配置類。有了這些自動配置類,就省去了我們麻煩的配置工作。
在這裏插入圖片描述
4.自動配置類是如何加載進來的

我們進入獲取到configurations的getCandidateConfigurations()方法內部查看。

在這裏插入圖片描述
通過註釋我們可以看到這裏的返回值是候選配置的集合。

其內部主要調用了的是loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())方法。
參數一是字節碼文件,參數二是類加載器。

我們再進入loadFactoryNames方法內部。
在這裏插入圖片描述其中 FACTORIES_RESOURCE_LOCATION的定義如下:
在這裏插入圖片描述Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作。

5.總結
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章