前言
SpringBoot其实从诞生以来围绕的核心就是快速构建项目,快速构建的前提是有人帮你做好轮子,开发者只要拿来即用就好了,而造好轮子的人就是SpringBoot的开发者,引入自动配置的形式帮助开发者快速创建项目,而自动配置采用的是一种starter模块形式,比如web模块就引入spring-boot-starter-web。而且SpringBoot依旧支持第三方组件融入到SpringBoot的生态圈中,比如Mybatis的组件模块名:mybatis-spring-boot-starter。今天就来分享一下第三方组件是如何引入SpringBoot里面来的。
介绍
自定义starter看懂了之后其实也不是很难,就拿最近我的一个开源框架做示例吧,正好也要开发一个支持SpringBoot的小功能。
iagent:一个采用接口动态代理的形式封装HTTP请求小组件(快速跳转),不过最近打算重构了。
本想着开发这个就是能够在项目中统一一下调用其他厂商HTTP的接口,免得太乱的本质想法开发的,但是自从我接触到微服务之后才发现原来有个Ribbon + Fegin框架,只能说博主的老东家太过传统,自身接触不到这块的东西。
创建
首先需要引入SpringBoot自动配置组件
spring-boot-autoconfigure:自定义starter必备引入jar包
spring-boot-configuration-processor:该组件是用来在properties或者yml文件当中给予提示的。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies>
然后需要一个对应的实体类用来保存properties或yml文件中的环境变量,使用@ConfigurationProperties映射前缀
然后还需要一个自动配置的类
一般自动配置类命名方式为 XXXXAutoConfiguration 表示改类为自动配置类
@Configuration:这个注解不多介绍了,就是表示为配置类
@EnableConfigurationProperties:该注解是用来开启配置参数的注解的,将配置文件中的变量加载到Properties的配置类对象当中,并注入到容器当中
并且SpringBoot还提供了一些@Conditional注解:
@ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
@ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
@ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件以上注解都是元注解@Conditional演变而来的,根据不用的条件对应创建以上的具体条件注解。
接下来就是加载配置文件了,根据SpringBoot的自动配置原理,SpringBoot会自动加载META-INF/spring.factories文件中的数据
所以还需要加一个配置,这样SpringBoot才能扫描到这个自动配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration表示自动配置类。
这样自定义starter就好了,我们可以写个测试用例试一下。
说明自定义starter已经开发好啦