日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot自動裝配原理詳解

瀏覽:163日期:2023-03-21 15:10:12

首先對于一個SpringBoot工程來說,最明顯的標志的就是 @SpringBootApplication它標記了這是一個SpringBoot工程,所以今天的 SpringBoot自動裝配原理也就是從它開始說起。

自動裝配流程

首先我們來看下@SpringBootApplication 這個注解的背后又有什么玄機呢,我們按下 ctrl + 鼠標左鍵,輕輕的點一下,此時見證奇跡的時刻..我們看到如下優雅的代碼:

SpringBoot自動裝配原理詳解

這其中有兩個比較容易引起我們注意的地方,一個是@SpringBootConfiguration注解,另一個是@EnableAutoConfiguration注解;之所以說這個兩個注解比較吸引我們的眼球, 不是因為它們長大的好看,而是因為其他的注解太難看了(主要是因為其他的注解我們都是比較熟悉,即使不知道他們是干什么的,可以肯定更自動裝配是沒有關系的)。 然后我們又伸出了邪惡的小手,開啟了熟悉的操作,按下了Ctrt + 鼠標左鍵,瞪著色咪咪的小眼睛,瞳孔放大了百倍等待著奇跡的出現... 擦... 擦...擦...

SpringBoot自動裝配原理詳解

什么也沒有...那我要你有何用,這么頂級的世界級的開源項目,怎么會讓一個沒用的家伙存在呢? 于是動用了上億的腦細胞大軍,經過復雜的運算,得出了一個不靠譜的結論:它可能使用來標記這是一個SpringBoot工程的配置。因為SpringBootConfiguration翻譯過來就是SpringBoot的配置,于是心中又是幾萬只羊駝在萬馬奔騰,大漠飛揚。

氣定神閑之后,秉承著·失敗是成功之母'的信念, 熟練的左手行云流水般的按下了 Ctrl + Table 鍵,回到了最初的的地方。眼睛盯著 @EnableAutoConfiguration ,環顧左右,在地址欄輸入了谷歌翻譯, 結果顯示 自動裝配。我找的就是你,真是眾里尋他千百度,那人卻在燈火闌珊處。 熟練的按下了 Ctrl +左鍵,迫不及待的想要進入; 心里默默背誦起了《桃花源記》的經典詩句 ∶

林盡水源,便得一山,山有小口,仿佛若有光。便舍船,從口入。初極狹,才通人。復行數十步,豁然開朗

SpringBoot自動裝配原理詳解

此時此刻心情愉悅,有過前面的經歷之后,在面對新的世界時候,我們淡定了許多。 此時大腦高速運轉,沒有再糾結,直搗黃龍,進入了 AutoConfigurationImportSelector.class 類,因為谷歌翻譯告訴我們,這個是自動配置導入選擇器。 于是我們發現了—片新天地

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;} // 獲取自動配置的實體AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());} // 具體用來加載自動配置類得方法protected AutoConfigurationEntry getAutoConfigurationEntry(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, );configurations.removeAll(exclusions);configurations = getConfigurationClassFilter().filter(configurations);fireAutoConfigurationImportEvents(configurations, exclusions); // 返回最終需要的配置return new AutoConfigurationEntry(configurations, exclusions);}}

而這個自動配置的實體 AutoConfigurationEntry里面有兩個屬性,configurations和 exclusions。

protected static class AutoConfigurationEntry { // 用來存儲需要的配置項private final List<String> configurations; // 用來存儲排除的配置項private final Set<String> exclusions;private AutoConfigurationEntry() {this.configurations = Collections.emptyList();this.exclusions = Collections.emptySet();} }

在后面可以看到 getAutoConfigurationEntry()方法返回了一個對象 return new AutoConfigurationEntry(configurations, exclusions);這里也就是把我們需要的配置都拿到了。

那他是怎么拿到的候選的配置類呢? 我們接著看這個獲取候選配置類的方法 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);進到方法后我們看到下面這個方法具體獲取候選配置類的方法內容

SpringBoot自動裝配原理詳解

這里我們跟著斷點去走,首先進入getSpringFactoriesLoaderFactoryClass()方法

protected Class<?> getSpringFactoriesLoaderFactoryClass() { // 返回的是EnableAutoConfiguration字節碼對象return EnableAutoConfiguration.class;}

接著我們在進入getBeanClassLoader()方法,這里就是一個類加載器

protected ClassLoader getBeanClassLoader() {return this.beanClassLoader;}

最后我們在進入loadFactoryNames()方法,這個方法就是根據剛才的字節碼文件和類加載器來找到候選的配置類。傳遞過來的字節碼

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {ClassLoader classLoaderToUse = classLoader;if (classLoaderToUse == null) {classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();} // 獲取的EnableAutoConfiguration.class的權限定名 //org.springframework.boot.autoconfigure.EnableAutoConfigurationString factoryTypeName = factoryType.getName();return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());}

如下圖:

SpringBoot自動裝配原理詳解

最后通過loadSpringFactories()來獲取到所有的配置類

private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) { // 緩存加載的配置類Map<String, List<String>> result = cache.get(classLoader);if (result != null) {return result;} result = new HashMap<>();try { // 去資源目錄下找Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();String[] factoryImplementationNames =StringUtils.commaDelimitedListToStringArray((String) entry.getValue());for (String factoryImplementationName : factoryImplementationNames) {result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>()).add(factoryImplementationName.trim());}}}// Replace all lists with unmodifiable lists containing unique elementsresult.replaceAll((factoryType, implementations) -> implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList))); // 加載完成放到緩存中cache.put(classLoader, result);}catch (IOException ex) {throw new IllegalArgumentException('Unable to load factories from location [' +FACTORIES_RESOURCE_LOCATION + ']', ex);} // 返回加載到的配置類return result;}

這里我們要看下怎么從資源目錄下 FACTORIES_RESOURCE_LOCATION 加載的。下面是加載配置文件的路徑:

SpringBoot自動裝配原理詳解

也就是項目啟動的時候會去加載所有 META-INF 下的所有的 spring.factories 文件,我們搜一下這個這個文件,我搭建的是一個很簡單的 SpringBoot 工程,它會去這幾個 jar 里面找相關的配置類

SpringBoot自動裝配原理詳解

但是最后自動裝配的類是這個spring-boot-autoconfigure-2.4.3.RELEASE.jar

SpringBoot自動裝配原理詳解

而根據EnabLeAutoConfiguration.class字節碼加載的配置類就只有這118自動配置類

SpringBoot自動裝配原理詳解

小結

實際上SpringBoot的自動裝配原理,其實就是在項目啟動的時候去加載META-INF下的 spring.factories 文件,好像也沒有那么高大上。當然在啟動的過程中還會有其他的配置項的加載,這里咱么直說了自動裝配的加載過程。希望對大家可以有所啟發。

以上就是SpringBoot自動裝配原理詳解的詳細內容,更多關于SpringBoot自動裝配原理的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷亚洲成人| 日韩精品五月天| 久久影院一区二区三区| 欧美日韩精品一区二区三区在线观看| 一二三区精品| 亚洲精品护士| 欧美一区成人| 综合在线一区| 日韩精品中文字幕吗一区二区| 综合国产精品| 欧美精品国产| 国产一区一一区高清不卡| 91免费精品| 视频一区中文| 免费成人在线观看| 亚洲三级视频| 福利欧美精品在线| 久久精品主播| 亚洲精品字幕| 国产aa精品| 亚洲激情黄色| 久久av综合| 午夜欧美在线| 亚洲欧美日韩专区| 国产图片一区| 欧美69视频| 国产亚洲精品美女久久 | 青草国产精品| 久久青草久久| 国产精品麻豆成人av电影艾秋| 欧美亚洲精品在线| 免费在线欧美黄色| 亚洲午夜免费| 日韩精品一区二区三区免费观看| 中文字幕av一区二区三区四区| 91一区二区三区四区| 9国产精品视频| 极品av在线| 国产精品一区二区av交换 | 亚洲va在线| 国产精品一区二区三区av麻| 亚洲激情黄色| 日韩不卡视频在线观看| 国产欧美日韩一区二区三区四区 | 国产亚洲一卡2卡3卡4卡新区| 国产精品三上| av中文字幕在线观看第一页| 亚洲精品大片| 黄色国产精品| 欧美日韩亚洲在线观看| 国产成年精品| 精品国产网站| 久久精品天堂| 国产精品jk白丝蜜臀av小说| 日韩av一区二区三区四区| 美女网站久久| | 国产精品99久久免费观看| 欧美伊人影院| 国产精品15p| 国产亚洲精品精品国产亚洲综合| 中文字幕亚洲在线观看| 亚洲精品日韩久久| 日韩一区网站| 欧美在线看片| 精品欠久久久中文字幕加勒比| 国产成人久久精品一区二区三区| 国产精品一区2区3区| 国产成人久久| 136国产福利精品导航网址| 欧美高清不卡| 水蜜桃久久夜色精品一区的特点| 免费看黄色91| 国产精品探花在线观看| 久久精品一本| 日韩伦理在线一区| 亚洲国产福利| 国产综合色产| 亚洲人成精品久久久| 国产精品亚洲综合在线观看| 精品丝袜在线| 亚洲欧美网站| 免费亚洲婷婷| 亚洲一区中文| 久久精品凹凸全集| 亚洲成av人片一区二区密柚| 一区二区电影在线观看| 国产精品入口久久| 美女毛片一区二区三区四区| 91免费精品国偷自产在线在线| 国产精品久久久久久妇女| 日本午夜大片a在线观看| 久久国产精品99国产| 久久久久伊人| 亚洲一区二区小说| yellow在线观看网址| 亚洲精品中文字幕99999| 日韩伦理一区| 国产精品久久久久av蜜臀| 黄色成人91| 成人污污视频| 97久久亚洲| 国产毛片久久| 中文另类视频| 国产精品igao视频网网址不卡日韩| 三上悠亚国产精品一区二区三区| 中文字幕成人| 米奇777超碰欧美日韩亚洲| 国产精品色婷婷在线观看| 中文一区一区三区免费在线观 | 免费一二一二在线视频| 日韩激情网站| 日韩制服丝袜先锋影音| 亚洲不卡av不卡一区二区| 麻豆精品蜜桃视频网站| 免费看欧美美女黄的网站| 91精品综合| 国产成人调教视频在线观看| 日韩av不卡一区二区| 最新国产精品视频| 欧美在线亚洲| 欧洲av一区二区| 麻豆网站免费在线观看| 九九九精品视频| 国产精品乱战久久久| 青草综合视频| 国产精品一区毛片| 欧美日韩一区二区三区不卡视频| 亚洲一二三区视频| 日韩国产在线一| 国产欧美大片| 国产精品观看| 九九久久国产| 吉吉日韩欧美| 影院欧美亚洲| 亚洲一区二区三区高清不卡| 黄色成人精品网站| 日韩在线成人| 国产欧美日韩亚洲一区二区三区| 日韩av中文字幕一区| 91免费精品国偷自产在线在线| 国产探花一区在线观看| 成人一区而且| 亚洲电影在线| 久久国产精品久久久久久电车| 中文字幕日韩亚洲| 国产精品啊啊啊| 精品捆绑调教一区二区三区 | 中文在线资源| 鲁大师成人一区二区三区| 国产午夜久久av| 久久久久久色| 久久久免费人体| 国产麻豆久久| 伊人久久亚洲| 久久久久久色 | 免费一级欧美片在线观看网站| 色婷婷亚洲mv天堂mv在影片| 天堂资源在线亚洲| 91精品视频一区二区| 日韩亚洲一区在线| 亚洲精品少妇| 欧美天堂视频| 日韩一区二区三区在线看| 亚洲精品福利电影| 日韩av网站在线免费观看| 亚洲午夜精品久久久久久app| 欧美亚洲国产日韩| 国产精品嫩草99av在线| 国精品产品一区| 免费不卡中文字幕在线| 麻豆精品av| 在线国产日韩| 九色porny丨国产首页在线| 久久a爱视频| 91精品国产自产观看在线| 樱桃成人精品视频在线播放| 精品黄色一级片| 91成人在线网站| 亚洲三级精品| 先锋影音国产一区| 999国产精品视频| 91嫩草亚洲精品| 久久精品国产成人一区二区三区| 一区二区三区四区日韩| 久久青青视频| 中文在线免费视频| 国产一区二区三区不卡视频网站| 国产精品一区二区av交换| 日本不卡不码高清免费观看| 亚洲人www| 日本不卡中文字幕| 日韩欧美美女在线观看| 亚洲另类黄色| 青青在线精品| 国产精品扒开腿做爽爽爽软件| 欧美亚洲三级| 精品国产一区二| 欧美日韩视频网站| 亚洲激情另类|