zoukankan      html  css  js  c++  java
  • 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

    (完)

    微信公众号
  • 相关阅读:
    软件可靠性与安全性设计与实现知识梳理(软件可靠性与安全性高级技术研讨会心得)
    SSM框架整合
    不注册Tomcat服务,运行Tomcat不弹出JAVA控制台窗口
    ExtJS表单之复选框CheckboxGroup展示与取值
    ExtJS获取父子、兄弟容器元素方法
    LabVIEW之生产者/消费者模式--队列操作 彭会锋
    ExtJS Grid导出excel文件
    jeesite部署到Tomcat后,无法访问,cannot be resolved in either web.xml or the jar files deployed with this application
    滚动轮播插件——jCarouselLite
    统计学基础之假设检验
  • 原文地址:https://www.cnblogs.com/cnblog-long/p/7248352.html
Copyright © 2011-2022 走看看