Spring Boot 開箱即用,內藏玄機

樑桂釗發表於2016-12-25

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 是什麼作用呢?我們先來大概理解下面的程式碼。

Spring Boot 開箱即用,內藏玄機

原始碼中的方法主要是是將 @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 就會觸發自動化配置。

原始碼

相關示例完整程式碼: springboot-action

(完)

更多精彩文章,盡在「服務端思維」微信公眾號!

Spring Boot 開箱即用,內藏玄機

相關文章