搜尋
首頁Javajava教程java SpringBoot自動組裝原理是什麼

java SpringBoot自動組裝原理是什麼

Apr 25, 2023 am 08:16 AM
javaspringboot

summary

detail

傳統的Spring專案會有很多的設定文件,例如我們要使用Redis,一般除了對應的依賴的jar包我們還需要在application.xml裡面配置JedisConnectionFactory、JedisPoolConfig、RedisTemplate。但是如果使用SpringBoot的話,系統會根據pom.xml裡面的jar包,自動產生這些類別並且注入到IOC容器當中。

傳統Spring專案中需要配置

<bean id="jedisConnectionFactory" class="...JedisConnectionFactory"></bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"></bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"></bean>

而使用SpringBoot的話,除了pom.xml引入對應的jar包外,只需要在application.properties配置對應的屬性值即可

以Redis舉例

  • 從spring-boot-autoconfigure.jar/META-INF/spring.factories中取得120多個預設功能配置類,其中包括redis的功能配置類別RedisAutoConfiguration的全限定名,一般一個功能配置類別圍繞該功能,負責管理創建多個相關的功能類,例如RedisAutoConfiguration負責:

JedisConnectionFactory、RedisTemplate、StringRedisTemplate這3個功能類別的建立

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  • RedisAutoConfiguration設定類別生效的條件是@ConditionalOnClass :JedisConnection.class, RedisOperations.class, Jedis.class,所以會去classpath下去找對應的class檔案

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {}
  • 如果pom.xml有對應的jar套件,就能匹配到對應依賴class:JedisConnection.class, RedisOperations.class, Jedis.class

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • 匹配成功,這個功能配置類別才會生效,同時會注入預設的屬性配置類別@EnableConfigurationProperties(RedisProperties.class)

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;
    private int port = 6379;
  • Redis功能配置裡面會根據條件產生最終的JedisConnectionFactory、RedisTemplate,條件就是IOC環境裡面,沒有使用者自訂的

# @ConditionalOnMissingBean(RedisConnectionFactory.class)、RedisTemplate

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
        @Bean
        @ConditionalOnMissingBean(RedisConnectionFactory.class)
        public JedisConnectionFactory redisConnectionFactory()
                throws UnknownHostException {
            return applyProperties(createJedisConnectionFactory());
        }

        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(
                RedisConnectionFactory redisConnectionFactory)
                        throws UnknownHostException {
            RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
}
  • 最終建立好的預設組裝類,會透過功能配置類別裡面的@Bean註解,注入到IOC當中

原理與結果分析

透過各種註解,SpringApplication.run(Application.class, args)在執行時,會讀取spring-boot-autoconfigure.jar裡面的spring. factories設定文件,設定檔中有所有自動組裝類別的設定類別的className,然後產生對應功能的Configuration類,這些功能設定類別要生效的話,會去classpath找是否有該類別的依賴類別(也就是pom .xml必須有對應功能的jar包才行),然後配置類裡再通過判斷生成最後的功能類,並且配置類裡面注入了默認屬性值類,功能類可以引用並賦默認值。產生功能類別的原則是自訂優先,沒有自訂時才會使用自動組裝類別。

綜上所述,要想自動組裝一個類別需要滿足2個條件:

  • #spring.factories裡面有這個類別的設定類別(一個配置類別可以建立多個圍繞該功能的依賴類別)

  • pom.xml裡面需要有對應的jar套件

#整個過程的結果是兩件事:

  • 根據各種判斷和依賴,最終生成了業務需要的類別並且注入到IOC容器當中了

  • 自動組裝產生的類別賦予了一些預設的屬性值

#依賴的註解

  • ##@ SpringBootApplication:sb專案應用程式啟動類別的註解,其實是3個註解的組合:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,其中在自動組裝中起作用的是第二個

  • ############################################################### #@EnableAutoConfiguration:表示SB應用程式啟動自動組裝的功能(包含載入對應的Bean到IOC容器中,且根據預設配置對屬性賦值)###########@Import(EnableAutoConfigurationImportSelector.class) :這個註解比較厲害,可以把沒有註冊到IOC中的Bean強行註冊到IOC中,表示啟動自動配置功能需要引入EnableAutoConfigurationImportSelector.class才行############@Configuration### #########@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }):表示讓RedisAutoConfiguration配置類別運作的話,必須有包含這些類別的jar包才行#### ########@EnableConfigurationProperties(RedisProperties.class):表示預設引用RedisProperties.class裡面的配置############@ConditionalOnMissingBean(RedisConnectionFactory.class):這是個很厲害的註解,實現自動組裝時自訂優先。表示如果使用者沒有自訂注入RedisConnectionFactory.class類,才會使用預設的JedisConnectionFactory。 ###

自動組裝的過程

  • 透過各種註解實現了類別與類別之間的依賴關係,容器在啟動的時候Application.run,會呼叫EnableAutoConfigurationImportSelector.class的selectImports方法(其實是其父類別的方法)

  • selectImports方法最終會呼叫SpringFactoriesLoader.loadFactoryNames方法來取得一個全面的常用Bean#Configuration列表清單

  • ##loadFactoryNames方法會讀取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar 下面的spring.factories),取得到所有的Spring相關的Bean的全限定名ClassName,大概120多個

  • selectImports方法繼續呼叫filter(configurations, autoConfigurationMetadata);這個時候會根據這些BeanConfiguration裡面的條件,來一一篩選,最關鍵的是@ConditionalOnClass,這個條件註解會去classpath下要查找,jar包裡面是否有這個條件依賴類,所以必須有了相應的jar包,才有這些依賴類,才會生成IOC環境需要的一些預設配置Bean

  • 最後把符合條件的BeanConfiguration注入預設的EnableConfigurationPropertie類別裡面的屬性值,並且注入到IOC環境當中

以上是java SpringBoot自動組裝原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具