图片

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 })@EnableConfigurationPropertiespublic 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 就会触发自动化配置。


更多相关文章

  1. Java 开发者写 SQL 时常犯的 10 个错误
  2. 专属开发者的福利,1000刀+的羊毛在等你
  3. Web开发者必备的20款超赞jQuery插件
  4. 你能确定IE8的开发者工具栏中的hasLayout吗?
  5. Mongodb 的ORM框架 Morphia 注解二 —————— @Id
  6. iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级
  7. 开发者实验室体验之文智自然语言处理SDK by python
  8. UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的sh
  9. 注解匹配表字段与实体字段

随机推荐

  1. Map集合、散列表、红黑树介绍
  2. 《深入理解Java虚拟机》读书笔记
  3. 适配器模式在开源代码中的应用
  4. 如何快速地看书?
  5. HashMap就是这么简单【源码剖析】
  6. 开始学习C语言
  7. Java集合总结【面试题+脑图】,将知识点一
  8. 装饰器模式在开源代码中的应用
  9. LinkedHashMap就这么简单【源码剖析】
  10. 外观模式在开源代码中的应用