前言:
今天介绍springboot ,也是写下springboot的插件机制,starter的原理,其实这个网上已经很多了,也是看了不少别人的文章,今天主要还是带着问题去记录下。
这个问题是很简单的,只要了解springboot的同学应该都知道,也是必须了解的。
我们看个例子,下面是我工作中的一个starter,删除了一些公司的代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.xx.common.ratelimiter.config.reactive.WebsocketRateLimiterAutoConfiguration,\ com.xx.common.ratelimiter.config.ProductIdLimiterAutoConfiguration
解释下:
@Configuration @ConditionalOnProperty( prefix = "gateway.ratelimiter", name = {"enabled"}, havingValue = "true" ) @EnableConfigurationProperties(RateLimiterProperties.class) @AutoConfigureAfter({RedisAutoConfiguration.class}) public class ProductIdLimiterAutoConfiguration { ... }
上面这个是配置类,可以看到这个最主要的是一些注解
springboot starter的原理就是springboot项目在启动的时候扫描jar,然后读取spring.factories 中EnableAutoConfiguration key 指向的config类
然后通过一系列的条件配置判断,启动当前stater
第一个问题解决了主要流程的问题,但是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";当然这段是代码我们也可以用来加载其他的文件哦,也给我们借鉴,在下次需要实现类似的功能,可以直接抄。
这个问题已经很简单了,因为第一个问题已经基本上可以看到原因了,
在springboot 加载到config的时候,可以在config中通过@bean进行容器注册,这个bean就会加载到容器
这里主要要说几个特殊的注解,@ConditionalOnXXX
如果想要定制自己的condition,可以实现Condition接口,定制Condition条件
springboot starter 是springboot 的核心,提供了autoconfig,在开发中非常方便,也是必须需要了解的。