在日常使用SpringBoot的开发中,我们想要引入某个组件,几乎都是直接引入一个SpringBootStarter就完事,什么配置文件大发布分省略甚至是完全省略的。在前面的文章中,我们分析了SpringBoot的具体启动流程《 SpringBoot启动流程探究 》、以及SpringBoot自动配置的原理 《 SpringBoot自动配置原理 》 。通过这两篇文章其实很容易弄清楚那些官方的starter是如何运行起来的,并且我们可以制作一个自己的SpringBootStarter,并且我会把自制的SpringBootStarter推送到公服,本篇文章会记录一个完整的开发流程。
创建SpringBootStarter
其实就是创建一个普通的SpringBoot项目,无论是用Gradle还是Maven都可以,我这里选择的是Maven的方式,只不过项目的命名方式略微有所不同,因为Spring官方的starter命令为spring-boot-starter-xxx,所以我们开发的项目不要以spring-boot开头。 建议写成:xxx-spring-boot-starter,代表我们这是一个非官方的SpringBootStarter。
pom.xml
1 |
|
我们编写一个工具类AESHandleUtil.java,假设我们需要封装一个AES加密的工具类,在这个工具类里面呢,我们想把初始化秘钥随机串的长度作为用户的自定义参数,用户可以根据自己的实际需要定义是长度为128?256还是一些其他的值。
1 | package com.github.zouchanglin.examplespringbootstarter.util; |
接下来我们写一个AESHandleService.java,其实就是对工具类做了一个封装:
1 | package com.github.zouchanglin.examplespringbootstarter.service; |
由于我们需要用户去自定义一些参数,那么我们先用一个类把自定义参数给装起来,AESHandleServiceProperties.java:如果对这些注解有疑问的话可以参考我的一篇文章《 SpringBoot自定义配置文件 》,里面对SpringBoot自定义配置的操作解释的比较详细。
1 | package com.github.zouchanglin.examplespringbootstarter.config; |
接下来就是最重要的一步:编写自动装配类AESHandleAutoConfiguration.java:
1 | package com.github.zouchanglin.examplespringbootstarter.config; |
当然关于Bean的实例化条件控制等,也可以加上@ConditionalOnBean与@ConditionalOnClass这些注解,在这里就不详细介绍这些注解了。官方的参数文档在这里:《49.3.2 Bean Conditions》 。接下来需要编写spring.factories,这一步也很重要,Spring Boot自动注入的原理来源于 Spring Boot应用在启动过程中会通过SpringFactoriesLoader
加载所有 META-INF/spring.factories
文件,通过一系列的处理流程最终将spring.factories 文件中的定义的各种 beans
装载入ApplicationContext容器。所以编写spring.factories一定别忘记:
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
最后,由于我们把测试的依赖删除了,所以测试代码也可以选择不要,那么整个工程目录如下图所示:
最后一步,只需要mvn install,就可以把这个starter发布到本地仓库。
测试SpringBootStarter
新建SpringBoot项目并且引入这个Starter:
1 | <dependency> |
并且我们可以在配置文件里面指定这个starter可以配置的参数,即随机串的长度(其实不配置也有默认值)
接下来通过测试代码去测试一下:
1 | package com.example.demo; |
推送至远端仓库
这个步骤比较容器,我们选择JitPack,JitPack在得到我们的GitHub账户授权之后可以拉取我们的仓库里的代码,我们只需要把项目放在GitHub上,并且打一个Tag(其实就是发布一个Release版本),我以我之前测试的MD5的一个starter来说,md5-spring-boot-starter ,只需要有发布版本即可:
然后在jitpack授权,授权之后即可看到自己的仓库和Release版本:
最后,在需要的项目中引入即可:
1 | <repositories> |
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/2020/05/05/3271812349.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!