深度解讀:Spring.3版本自動(dòng)裝配機(jī)制的演變與實(shí)踐
前言
今天,我們將開啟對(duì)Spring-AI系列源碼的講解。請(qǐng)大家不急不躁,我會(huì)逐步深入,每次專注于一個(gè)知識(shí)點(diǎn),以防讓人感到困惑。
首先,源碼的討論自然離不開自動(dòng)裝配。有人可能會(huì)問,之前已經(jīng)講解過這個(gè)內(nèi)容了,為什么還要再談一次?這是因?yàn)樽許pring Boot 3.3.x版本以來,自動(dòng)裝配的機(jī)制發(fā)生了一些變化。盡管如此,憑借我們已具備的源碼閱讀能力,今天我們將簡單回顧一下新版Spring如何處理自動(dòng)裝配的問題。畢竟,隨著版本的不斷升級(jí),我們必須適應(yīng)新的機(jī)制,避免仍用舊有的思維去解讀源碼。
版本依賴
要深入探索Spring-AI,首先需要配置多個(gè)關(guān)鍵依賴。以下是必不可少的核心依賴:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在完成引入之后,我們便能夠順暢地查看源碼邏輯了。同時(shí),請(qǐng)務(wù)必下載相關(guān)的文檔資料,以便更好地理解和分析。
自動(dòng)裝配
之前我們已討論過,SpringBoot的自動(dòng)裝配機(jī)制默認(rèn)查找的是包內(nèi)的META-INF/spring.factories文件。以下展示的是早期版本的裝配源碼,敬請(qǐng)留意。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
在此,loadFactoryNames 方法會(huì)去查找 META-INF/spring.factories 文件。然而,當(dāng)我查找自動(dòng)裝配的源碼時(shí),費(fèi)了很大勁卻未能找到這個(gè)文件。
圖片
這顯然存在問題,第一步就陷入了困境。因此,我重新回到原點(diǎn),重新查找了自動(dòng)裝配的源碼。這一次,我更換了檢查的文件,以下是相關(guān)的源碼:
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
.getCandidates();
Assert.notEmpty(configurations,
"No auto configuration classes found in "
+ "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
最終,我發(fā)現(xiàn)了問題的根源。原來這里更改為 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。至此,自動(dòng)裝配機(jī)制中又新增了一個(gè)需要記住的文件名稱。所幸,這個(gè)名稱也并不難以記憶。接下來查看了一下,發(fā)現(xiàn)實(shí)際內(nèi)容與之前的文件相似。
圖片
好的,裝配的準(zhǔn)備工作已經(jīng)充分完成。接下來的章節(jié)將深入探討更為細(xì)致的內(nèi)容。
總結(jié)
在今天的講解中,我們從Spring-AI的源碼出發(fā),逐步解構(gòu)了自動(dòng)裝配的演變與實(shí)踐。雖然自動(dòng)裝配的核心概念自以往并無太大改變,但Spring Boot 3.3.x版本帶來的機(jī)制調(diào)整,確實(shí)值得我們重新審視。通過回顧新版的自動(dòng)裝配實(shí)現(xiàn)方式,我們不僅加深了對(duì)新機(jī)制的理解,也為后續(xù)的源碼分析奠定了堅(jiān)實(shí)的基礎(chǔ)。
隨著版本的迭代,保持對(duì)新技術(shù)的敏銳洞察,將是我們不斷探索與進(jìn)步的關(guān)鍵。希望大家能夠跟隨我們的步伐,深入領(lǐng)悟每一個(gè)知識(shí)點(diǎn),最終在源代碼的浩瀚宇宙中找到屬于自己的那一片星辰。