Spring Boot 揭祕與實戰 源碼分析 - 開箱即用,內藏玄機

前言

Spring Boot提供了很多”開箱即用“的依賴模塊,那麼,Spring Boot 如何巧妙的做到開箱即用,自動配置的呢?

開箱即用,內藏玄機

Spring Boot提供了很多”開箱即用“的依賴模塊,都是以spring-boot-starter-xx作爲命名的。例如,之前提到的 spring-boot-starter-redis、spring-boot-starter-data-mongodb、spring-boot-starter-data-elasticsearch 等。

Spring Boot 的開箱即用是一個很棒的設計,給開發者帶來很大的便利。開發者只要在 Maven 的 pom 文件中添加相關依賴後,Spring Boot 就會針對這個應用自動創建和注入需要的 Spring Bean 到上下文中。

那麼,Spring Boot 如何巧妙的做到開箱即用,自動配置的呢?

現在,我們通過源碼深入分析下 Spring Boot 的實現原理吧。

自動注入的核心在於 spring-boot-autoconfigure.jar 這個類庫。在分析之前,我們先來看幾個文件。

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties
public class RedisAutoConfiguration {}
@Configuration
@ConditionalOnClass({ Mongo.class, MongoRepository.class })
@ConditionalOnMissingBean({ MongoRepositoryFactoryBean.class,
    MongoRepositoryConfigurationExtension.class })
@ConditionalOnProperty(prefix = "spring.data.mongodb.repositories", 
    name = "enabled", havingValue = "true", matchIfMissing = true)
@Import(MongoRepositoriesAutoConfigureRegistrar.class)
@AutoConfigureAfter(MongoDataAutoConfiguration.class)
public class MongoRepositoriesAutoConfiguration {}
@Configuration
@ConditionalOnClass({ Client.class, TransportClientFactoryBean.class,
    NodeClientFactoryBean.class })
@EnableConfigurationProperties(ElasticsearchProperties.class)
public class ElasticsearchAutoConfiguration implements DisposableBean {}

上面三個源碼分別對應Redis、MongoDB、ElasticSearch。通過對比,我們會發現它們都有一個特點,都存在 @ConditionalOnClass 註解。這個註解就是問題的關鍵所在。

@ConditionalOnClass 是什麼作用呢?我們先來大概理解下面的代碼。

這裏寫圖片描述

源碼中的方法主要是是將 @ConditionalOnClass 的參數中對應的類進行查詢和匹配。

那麼,查詢的目的是什麼呢?查詢的目的在於, @ConditionalOnClass 參數中對應的類在 classpath 目錄下存在時,纔會去解析對應的配置類,否則不解析該註解修飾的配置類。

因此,Spring Boot 的開箱即用的實現原理,就很好簡單,用一句話就可以概括了。

Spring Boot 內部提供了很多自動化配置的類,例如,RedisAutoConfiguration 、MongoRepositoriesAutoConfiguration 、ElasticsearchAutoConfiguration , 這些自動化配置的類會判斷 classpath 中是否存在自己需要的那個類,如果存在則會自動配置相關的配置,否則就不會自動配置,因此,開發者在 Maven 的 pom 文件中添加相關依賴後,這些依賴就會下載很多 jar 包到 classpath 中,有了這些 lib 就會觸發自動化配置,所以,我們就能很便捷地使用對於的模塊功能了。

總結

Spring Boot 如何巧妙的做到開箱即用,自動配置的呢?實際上,Spring Boot 內部提供了很多自動化配置的類這些自動化配置的類會判斷 classpath 中是否存在自己需要的那個類,如果存在則會自動配置相關的配置,否則就不會自動配置,因此,開發者在 Maven 的 pom 文件中添加相關依賴後,這些依賴就會下載很多 jar 包到 classpath 中,有了這些 lib 就會觸發自動化配置。

轉載地址:http://blog.720ui.com/2016/springboot_source_autoconfigure/

發佈了65 篇原創文章 · 獲贊 67 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章