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

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot自動裝配原理詳解

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

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

自動裝配流程

首先我們來看下@SpringBootApplication 這個注解的背后又有什么玄機(jī)呢,我們按下 ctrl + 鼠標(biāo)左鍵,輕輕的點(diǎn)一下,此時見證奇跡的時刻..我們看到如下優(yōu)雅的代碼:

SpringBoot自動裝配原理詳解

這其中有兩個比較容易引起我們注意的地方,一個是@SpringBootConfiguration注解,另一個是@EnableAutoConfiguration注解;之所以說這個兩個注解比較吸引我們的眼球, 不是因?yàn)樗鼈冮L大的好看,而是因?yàn)槠渌淖⒔馓y看了(主要是因?yàn)槠渌淖⒔馕覀兌际潜容^熟悉,即使不知道他們是干什么的,可以肯定更自動裝配是沒有關(guān)系的)。 然后我們又伸出了邪惡的小手,開啟了熟悉的操作,按下了Ctrt + 鼠標(biāo)左鍵,瞪著色咪咪的小眼睛,瞳孔放大了百倍等待著奇跡的出現(xiàn)... 擦... 擦...擦...

SpringBoot自動裝配原理詳解

什么也沒有...那我要你有何用,這么頂級的世界級的開源項(xiàng)目,怎么會讓一個沒用的家伙存在呢? 于是動用了上億的腦細(xì)胞大軍,經(jīng)過復(fù)雜的運(yùn)算,得出了一個不靠譜的結(jié)論:它可能使用來標(biāo)記這是一個SpringBoot工程的配置。因?yàn)镾pringBootConfiguration翻譯過來就是SpringBoot的配置,于是心中又是幾萬只羊駝在萬馬奔騰,大漠飛揚(yáng)。

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

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

SpringBoot自動裝配原理詳解

此時此刻心情愉悅,有過前面的經(jīng)歷之后,在面對新的世界時候,我們淡定了許多。 此時大腦高速運(yùn)轉(zhuǎn),沒有再糾結(jié),直搗黃龍,進(jìn)入了 AutoConfigurationImportSelector.class 類,因?yàn)楣雀璺g告訴我們,這個是自動配置導(dǎo)入選擇器。 于是我們發(fā)現(xiàn)了—片新天地

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;} // 獲取自動配置的實(shí)體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); // 根據(jù)情況,自動配置需要的配置類和不需要的配置了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);}}

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

protected static class AutoConfigurationEntry { // 用來存儲需要的配置項(xiàng)private final List<String> configurations; // 用來存儲排除的配置項(xiàng)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);進(jìn)到方法后我們看到下面這個方法具體獲取候選配置類的方法內(nèi)容

SpringBoot自動裝配原理詳解

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

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

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

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

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

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {ClassLoader classLoaderToUse = classLoader;if (classLoaderToUse == null) {classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();} // 獲取的EnableAutoConfiguration.class的權(quán)限定名 //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自動裝配原理詳解

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

SpringBoot自動裝配原理詳解

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

SpringBoot自動裝配原理詳解

而根據(jù)EnabLeAutoConfiguration.class字節(jié)碼加載的配置類就只有這118自動配置類

SpringBoot自動裝配原理詳解

小結(jié)

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

以上就是SpringBoot自動裝配原理詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot自動裝配原理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久777| 国产欧美日韩一区二区三区在线| 欧美激情视频一区二区三区免费 | 欧美久久香蕉| 日本91福利区| 欧美在线不卡| 国产麻豆精品| 精品一区二区三区中文字幕视频| 国产精品一线| 精品午夜av| 日韩欧美一区二区三区免费看| 久久久精品五月天| 最新亚洲一区| 日韩国产一二三区| 久久精品国产福利| 久久三级视频| 另类av一区二区| 日本不卡一二三区黄网| 国产精品国码视频| a国产在线视频| 免费国产自久久久久三四区久久 | 欧美日韩一视频区二区| 精品黄色一级片| 91精品精品| 免费在线观看日韩欧美| 久久国产麻豆精品| 日本在线高清| aⅴ色国产欧美| 欧美综合精品| 88xx成人免费观看视频库| 黄色av一区| 日本麻豆一区二区三区视频| 国产精品一区二区三区www| 精品久久美女| 日韩午夜高潮| 国产精品久久久久久久久久久久久久久 | 日本美女一区| 日韩亚洲国产欧美| 欧美日韩黄网站| 日韩精品第一区| 蜜臀久久99精品久久久久宅男| 日本不卡一区二区三区| 精品国产一区二区三区av片| 黄色av日韩| 国产精品自在| 欧美国产91| 国产美女精品视频免费播放软件| 偷拍精品精品一区二区三区| 中文字幕亚洲精品乱码| 久久精品国产亚洲一区二区三区| 免费不卡中文字幕在线| 国产精品丝袜在线播放| 五月天久久久| 综合欧美精品| 亚洲国产欧美日本视频| 婷婷精品久久久久久久久久不卡| 国产在线不卡一区二区三区| 久久国产精品毛片| 日韩成人精品一区二区| 综合激情网...| 亚洲四虎影院| 欧美天堂一区| 亚洲激情偷拍| 亚洲黄色网址| 国产精品一区二区99| 在线视频亚洲| 国产中文在线播放| 欧美一级网址| 99日韩精品| 日本在线高清| 国产精品久久| 蜜臀精品久久久久久蜜臀| 日韩在线看片| 欧美激情麻豆| 日本中文字幕视频一区| 欧美日韩国产亚洲一区| 中文字幕在线视频久| 国产欧美高清视频在线| 免费不卡在线观看| 欧美日韩在线网站| 精品成av人一区二区三区 | 精品三级在线观看视频| 91精品尤物| 日本不卡视频在线观看| 国产精品入口久久| 四季av一区二区凹凸精品| 日本电影久久久| 美女久久一区| 久久免费国产| a天堂资源在线| 欧美xxxx性| 国产日韩欧美一区| 亚洲精品激情| 亚洲激情黄色| 91精品一区国产高清在线gif| 麻豆国产一区| 欧美久久久网站| 午夜电影一区| 爽好久久久欧美精品| 亚洲午夜天堂| 国产aⅴ精品一区二区三区久久| 国产伦精品一区二区三区视频 | 国产精品国码视频| 午夜精品福利影院| 日av在线不卡| 欧美日韩国产探花| 亚洲午夜黄色| 亚洲不卡av不卡一区二区| 精品国产乱码| 久久精品天堂| 国产精品v一区二区三区| 欧美综合精品| 欧美亚洲一级| 欧美色综合网| 国产精品资源| 国产精品4hu.www| 国产精品一区二区99| 国产日韩一区二区三区在线 | 成人av二区| 午夜久久tv| 亚洲欧美日韩国产一区二区| 国产伊人精品| 亚洲国产综合在线看不卡| 亚洲电影在线| 精品1区2区3区4区| 蜜臀av亚洲一区中文字幕| 影音先锋久久精品| 日本一区二区三区中文字幕| 四虎在线精品| 国产视频网站一区二区三区| 国产精品啊v在线| 久久久久伊人| 国产精品国产三级国产在线观看| 国产精品精品| 久久精品国产68国产精品亚洲| 亚洲特级毛片| 免费毛片在线不卡| 久久高清国产| 欧美亚洲人成在线| 精品高清久久| 国产99久久| 首页欧美精品中文字幕| 91麻豆精品激情在线观看最新 | 国产欧美三级| 福利视频一区| 国产精品88久久久久久| 亚洲日本久久| 麻豆一区二区在线| 免费污视频在线一区| 国产视频一区欧美| 亚洲无线观看| 你懂的亚洲视频| 久久亚洲精品中文字幕| 久久中文字幕二区| 亚洲精品国产精品粉嫩| 麻豆视频观看网址久久| 999国产精品999久久久久久| 一区二区三区网站| 精品伊人久久久| 欧美在线资源| 国产调教精品| 久久国产主播| 日韩精品国产精品| 国产网站在线| 亚洲最大av| 久久精品国产999大香线蕉| 国产一区欧美| 国产精品午夜一区二区三区| 国产麻豆久久| 日本在线不卡视频| av综合电影网站| 亚洲精品亚洲人成在线观看| 精品免费视频| 日韩中文欧美在线| 精品国产精品国产偷麻豆| 欧美日韩国产一区精品一区| 欧美日本一区| 在线日韩中文| 国产精品调教| 欧美日韩国产高清| 国产剧情在线观看一区| 欧美福利在线| 美女av一区| 久久伊人国产| 男人的天堂亚洲一区| 成人一区而且| 中文字幕一区二区精品区| 欧美www视频在线观看| 亚洲香蕉久久| 偷拍精品精品一区二区三区| 日本高清久久| 久久亚洲国产| 国产精品综合色区在线观看| 国户精品久久久久久久久久久不卡| 日韩精品国产精品| 日韩高清不卡| 国产精品一区二区三区av| 夜夜嗨一区二区三区| 色一区二区三区四区| 婷婷精品在线|