Spring Boot 中starter的原理详析

 更新时间:2022年06月06日 11:57:47   作者:​ 香菜_香菜   ​  
这篇文章主要介绍了Spring Boot 中starter原理详析,文章围绕主题展开springboot的插件机制和starter原理相关资料,需要的小伙伴可以参考一下

前言:

今天介绍springboot ,也是写下springboot的插件机制,starter的原理,其实这个网上已经很多了,也是看了不少别人的文章,今天主要还是带着问题去记录下。

1、springboot 的starter 的启动原理是什么

原理

这个问题是很简单的,只要了解springboot的同学应该都知道,也是必须了解的。

  • ① Spring Boot 在启动时会去classpath中中寻找 resources/META-INF/spring.factories 文件
  • ② 根据 spring.factories 配置加载 AutoConfigure 类
  • ③ 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

来个例子

我们看个例子,下面是我工作中的一个starter,删除了一些公司的代码

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
com.xx.common.ratelimiter.config.reactive.WebsocketRateLimiterAutoConfiguration,\ 
com.xx.common.ratelimiter.config.ProductIdLimiterAutoConfiguration

解释下:

  • EnableAutoConfiguration 这个是固定的,在springboot启动的时候,会去实例化这个key之后的每一个类
  • \ 是连接符,也就是表示这是一行数据,只不过可以分行表示
  • WebsocketRateLimiterAutoConfiguration 后面这两行是业务自定义的config类,多个的话都好分割
@Configuration
@ConditionalOnProperty(
        prefix = "gateway.ratelimiter",
        name = {"enabled"},
        havingValue = "true"
)
@EnableConfigurationProperties(RateLimiterProperties.class)
@AutoConfigureAfter({RedisAutoConfiguration.class})
public class ProductIdLimiterAutoConfiguration {
...
}

上面这个是配置类,可以看到这个最主要的是一些注解

  • @Configuration 标识这是一个配置类
  • @ConditionalOnProperty 标识这个类的实例化需要在配置文件中存在 gateway.ratelimiter.enable 这个key,并且值为true
  • @EnableConfigurationProperties 将配置中的类,读取到RateLimiterProperties.class 这个对象中
  • @AutoConfigureAfter 这个顾名思义,需要在redis 的实例化之后,因为这个config依赖redis 。

小结

springboot starter的原理就是springboot项目在启动的时候扫描jar,然后读取spring.factories 中EnableAutoConfiguration key 指向的config类

然后通过一系列的条件配置判断,启动当前stater

2、springboot 是如何找到配置类的

第一个问题解决了主要流程的问题,但是springboo是怎么找到spring.fatories的呐、?

这个主要是涉及jar包中资源的读取,让我们看下这个流程。

主要的路径是下面这三个注解:

SpringBootApplication ->
    EnableAutoConfiguration -> 
      AutoConfigurationImportSelector org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports 
      org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry 
      org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations 
      org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames 
      org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION); 
      public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

通过上面的路径,我们找到了最终是通过classloader 加载jar中"META-INF/spring.factories";当然这段是代码我们也可以用来加载其他的文件哦,也给我们借鉴,在下次需要实现类似的功能,可以直接抄。

3、springboot starter 的bean 是怎么加载到容器的

这个问题已经很简单了,因为第一个问题已经基本上可以看到原因了,

在springboot 加载到config的时候,可以在config中通过@bean进行容器注册,这个bean就会加载到容器

这里主要要说几个特殊的注解,@ConditionalOnXXX

  • @ConditionalOnBean:当容器中有指定Bean的条件下进行实例化。
  • @ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。
  • @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。
  • @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
  • @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
  • @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
  • @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
  • @ConditionalOnExpression:基于SpEL表达式的条件判断。
  • @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
  • @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
  • @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
  • @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。

如果想要定制自己的condition,可以实现Condition接口,定制Condition条件

4、总结

springboot starter 是springboot 的核心,提供了autoconfig,在开发中非常方便,也是必须需要了解的。 

到此这篇关于Spring Boot 中starter原理详析的文章就介绍到这了,更多相关Spring Boot starter 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现小程序简单五子棋

    Java实现小程序简单五子棋

    这篇文章主要介绍了利用Java实现小程序简单五子棋,本程序适用于java初学者巩固类与对象、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼,下面来看具体实现吧
    2021-12-12
  • Java使用组件编写窗口实现网上文件下载

    Java使用组件编写窗口实现网上文件下载

    这篇文章主要为大家详细介绍了Java使用组件编写窗口实现网上文件下载的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Java获取泛型实际类型的方法详解

    Java获取泛型实际类型的方法详解

    这篇文章主要介绍了Java获取泛型实际类型的方法详解,泛型,即“参数化类型”,一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数,需要的朋友可以参考下
    2023-11-11
  • SpringBoot 动态配置Profile环境的方式

    SpringBoot 动态配置Profile环境的方式

    这篇文章主要介绍了SpringBoot 动态配置Profile环境的方式,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • springBoot 启动指定配置文件环境多种方案(最新推荐)

    springBoot 启动指定配置文件环境多种方案(最新推荐)

    springBoot 启动指定配置文件环境理论上是有多种方案的,一般都是结合我们的实际业务选择不同的方案,比如,有pom.xml文件指定、maven命令行指定、配置文件指定、启动jar包时指定等方案,今天我们一一分享一下,需要的朋友可以参考下
    2023-09-09
  • Spring Boot 从静态json文件中读取数据所需字段

    Spring Boot 从静态json文件中读取数据所需字段

    本文重点给大家介绍Spring Boot 从静态json文件中读取数据所需字段,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • SpringBoot浅析Redis访问操作使用

    SpringBoot浅析Redis访问操作使用

    Redis是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与多种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能
    2022-11-11
  • 如何导入spring源码到IDEA

    如何导入spring源码到IDEA

    这篇文章主要介绍了如何导入spring源码到IDEA,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • hadoop的hdfs文件操作实现上传文件到hdfs

    hadoop的hdfs文件操作实现上传文件到hdfs

    这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上、从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下
    2014-03-03
  • java 安全 ysoserial CommonsCollections6 分析

    java 安全 ysoserial CommonsCollections6 分析

    这篇文章主要介绍了java 安全 ysoserial CommonsCollections6示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论