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


文章目錄

  1. 1. 開箱即用,內藏玄機
  2. 2. 總結
  3. 3. 源代碼

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 這個類庫。在分析之前,我們先來看幾個文件。

  1. @Configuration
  2. @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
  3. @EnableConfigurationProperties
  4. public class RedisAutoConfiguration {}
  1. @Configuration
  2. @ConditionalOnClass({ Mongo.class, MongoRepository.class })
  3. @ConditionalOnMissingBean({ MongoRepositoryFactoryBean.class,
  4. MongoRepositoryConfigurationExtension.class })
  5. @ConditionalOnProperty(prefix = "spring.data.mongodb.repositories",
  6. name = "enabled", havingValue = "true", matchIfMissing = true)
  7. @Import(MongoRepositoriesAutoConfigureRegistrar.class)
  8. @AutoConfigureAfter(MongoDataAutoConfiguration.class)
  9. public class MongoRepositoriesAutoConfiguration {}
  1. @Configuration
  2. @ConditionalOnClass({ Client.class, TransportClientFactoryBean.class,
  3. NodeClientFactoryBean.class })
  4. @EnableConfigurationProperties(ElasticsearchProperties.class)
  5. 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 就會觸發自動化配置。

源代碼

相關示例完整代碼: springboot-action

(完)

 

微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM