深度解讀:Spring.3版本自動裝配機制的演變與實踐

努力的小雨發表於2024-09-14

前言

今天,我們將開啟對Spring-AI系列原始碼的講解。請大家不急不躁,我會逐步深入,每次專注於一個知識點,以防讓人感到困惑。

首先,原始碼的討論自然離不開自動裝配。有人可能會問,之前已經講解過這個內容了,為什麼還要再談一次?這是因為自Spring Boot 3.3.x版本以來,自動裝配的機制發生了一些變化。儘管如此,憑藉我們已具備的原始碼閱讀能力,今天我們將簡單回顧一下新版Spring如何處理自動裝配的問題。畢竟,隨著版本的不斷升級,我們必須適應新的機制,避免仍用舊有的思維去解讀原始碼。

版本依賴

要深入探索Spring-AI,首先需要配置多個關鍵依賴。以下是必不可少的核心依賴:

<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>

在完成引入之後,我們便能夠順暢地檢視原始碼邏輯了。同時,請務必下載相關的文件資料,以便更好地理解和分析。

自動裝配

之前我們已討論過,SpringBoot的自動裝配機制預設查詢的是包內的META-INF/spring.factories檔案。以下展示的是早期版本的裝配原始碼,敬請留意。

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 方法會去查詢 META-INF/spring.factories 檔案。然而,當我查詢自動裝配的原始碼時,費了很大勁卻未能找到這個檔案。

image

這顯然存在問題,第一步就陷入了困境。因此,我重新回到原點,重新查詢了自動裝配的原始碼。這一次,我更換了檢查的檔案,以下是相關的原始碼:

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;
}

最終,我發現了問題的根源。原來這裡更改為 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 檔案。至此,自動裝配機制中又新增了一個需要記住的檔名稱。所幸,這個名稱也並不難以記憶。接下來檢視了一下,發現實際內容與之前的檔案相似。

image

好的,裝配的準備工作已經充分完成。接下來的章節將深入探討更為細緻的內容。

總結

在今天的講解中,我們從Spring-AI的原始碼出發,逐步解構了自動裝配的演變與實踐。雖然自動裝配的核心概念自以往並無太大改變,但Spring Boot 3.3.x版本帶來的機制調整,確實值得我們重新審視。透過回顧新版的自動裝配實現方式,我們不僅加深了對新機制的理解,也為後續的原始碼分析奠定了堅實的基礎。

隨著版本的迭代,保持對新技術的敏銳洞察,將是我們不斷探索與進步的關鍵。希望大家能夠跟隨我們的步伐,深入領悟每一個知識點,最終在原始碼的浩瀚宇宙中找到屬於自己的那一片星辰。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章