徒手撸一个 Spring Boot 中的 starter
starter 背景
Spring Boot 目前已经变成了后端开发这必备技能之一,其中一个主要原因是 Spring Boot 中有个非常重要的机制(starter 机制)。
starter 能够抛弃以前繁杂的配置,将其统一集成进 starter,使用的时候只需要在 maven 中引入对应的 starter 依赖即可,Spring Boot 就能自动扫描到要加载的信息并启动相应的默认配置。
starter 让我们摆脱了各种依赖库的处理,以及各种配置信息的烦恼。SpringBoot 会自动通过 classpath 路径下的类发现需要的 Bean,并注册进 IOC 容器。Spring Boot 提供了针对日常企业应用研发各种场景的 spring-boot-starter 依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。
[[金三银四,如何涨薪看这里]](http://mp.weixin.qq.com/s?__b...
我们经常会看到或者使用到各种 xxx-starter。比如下面几种:
Spring Boot starter 原理
从总体上来看,无非就是将 Jar 包作为项目的依赖引入工程。而现在之所以增加了难度,是因为我们引入的是 Spring Boot Starter,所以我们需要去了解 Spring Boot 对 Spring Boot Starter 的 Jar 包是如何加载的?下面我简单说一下。
SpringBoot 在启动时会去依赖的 starter 包中寻找 /META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包,这类似于 Java 的 SPI 机制。
细节上可以使用 @Conditional 系列注解实现更加精确的配置加载 Bean 的条件。
JavaSPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。
自定义 starter 的条件
如果想自定义 Starter,首选需要实现自动化配置,而要实现自动化配置需要满足以下两个条件:
能够自动配置项目所需要的配置信息,也就是自动加载依赖环境;
能够根据项目提供的信息自动生成 Bean,并且注册到 Bean 管理容器中;
实现自定义 starter
pom.xml 依赖
根据需要自定义 Starter 的实现过程大致如下(以我定义的 Starter 为例):
定义 XxxProperties 类,属性配置类,完成属性配置相关的操作,比如设置属性前缀,用于在 application.properties 中配置。
TianProperties 代码:
创建 XxxService 类,完成相关的操作逻辑 。
TianService 代码:
定义 XxxConfigurationProperties 类,自动配置类,用于完成 Bean 创建等工作。
TianServiceAutoConfiguration 代码:
在 resources 下创建目录 META-INF,在 META-INF 目录下创建 spring.factories,在 SpringBoot 启动时会根据此文件来加载项目的自动化配置类。
「spring.factories 中配置」
把上面这个 starter 工程打成 jar 包:
使用自定义 starter
创建一个 Spring Boot 项目 test,项目整体如下图:
在项目中把自定义 starter 添加 pom 依赖
TestApplication 启动类
application.properties 中配置
写一个 TestController.java 类
把我们自定义的 starter 打成的 jar 依赖进来后,
可以看到其中多了一个 json 的文件。
最后启动项目,输入
http://localhost:9091/my/starter
controller 成功返回 ok,再看后台打印
这就成功的现实了自定义的 starter。
关键词:开箱即用、减少大量的配置项、约定大于配置
。
总结
Spring Boot 在启动时扫描项目所依赖的 JAR 包,寻找包含
spring.factories
文件的 JAR 包,然后读取
spring.factories
文件获取配置的自动配置类 AutoConfiguration`,然后将自动配置类下满足条件(
@ConditionalOnXxx
)的 @Bean 放入到 Spring 容器中(Spring Context)这样使用者就可以直接用来注入,因为该类已经在容器中了。
「只要我们的方向对了,就不怕路远!」
推荐阅读
版权声明: 本文为 InfoQ 作者【田维常】的原创文章。
原文链接:【http://xie.infoq.cn/article/e8e63c2891d3c64c47a98e91b】。文章转载请联系作者。
评论 (1 条评论)