Spring Boot 中starter原理详析

网友投稿 831 2022-07-26


目录1、springboot 的starter 的启动原理是什么原理来个例子小结2、springboot 是如何找到配置类的3、springboot starter 的bean 是怎么加载到容器的4、总结

前言:

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

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

原理

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

① 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 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,在开发中非常方便,也是必须需要了解的。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于mybatisPlus yml配置方式
下一篇:Java数据结构之二叉搜索树详解(java实现二叉搜索树)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~