概述
背景:
前面讲到了如何修改开源工具源码,上传至maven中央仓库,但是我觉得还不够完美,加载外部字典需要自己在代码中初始化,外部文件位置也是需要写死。如果我们能将配置卸载spring配置文件中,使用时像restTemplate等一样直接注入即可使用就更完美了。
解决措施:将jar包做成spring的starter。
什么是spi:
Service Provider Interface(SPI) 是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。
通俗来讲spi就是就是一种为了拓展而对外提供的约定,在java中 spi可以分为 jdk提供的spi 和 spring提供的spi。数据库驱动接口由jdk提供,而实现由具体的数据库厂商提供,这就是依托的jdk提供的spi。在spring体系中,我们用的各种template,我们引入依赖后为什么可以直接注入使用?spring并不知道其他三方组件该如何初始化,哪些些需要在启动的时候就放入spring容器。这时作为三方组件,想要将自己整合进spring,就需要遵守spring的spi机制。
原理:
我们随意打开一个springboot项目的启动类,如下:
再打开@SpringBootApplication注解源码
这里需要注意两个注解
@ComponentScan注解的作用是扫描@SpringBootApplication所在的Application类(即spring-boot项目的入口类)所在的包(basepackage)下所有的@component注解(或拓展了@component的注解)标记的bean,并注册到spring容器中。
@EnableAutoConfiguration注解加载的是资源目录META-INF文件下的spring.factories的文件。包括导入到项目中的Jar包的META-INF文件夹下的spring.factories文件。spring.factories文件是一个properties文件。
我的spring.factories 如下:
spring.factories 此次key为EnableAutoConfiguration,表示spring启动后会自动创建value对应的类,即JPingYingAutoConfiguration,如果需要创建多个类可以用逗号将value隔开。
接下来我们看看JPingYingAutoConfiguration的写法
@ConditionalOnClass({PinyinUtil.class})//判断当前classpath下是否存在指定类,若是则将当前的配置装载入spring容器
@EnableConfigurationProperties(JPingYingProperties.class)//激活自动配置(指定文件中的配置)
我们来看看properies类
此类的目的就是用来承接spring的配置文件中的配置,spring启动会自动将数据装载进这个类的实例中,我们可以再自己的jar包中需要的时候直接注入,然后使用。
我们再来看看需要引入的依赖
核心依赖是autoconfigure,这个包是准备为方便三方包整合进spring提供的。
processsor包主要功能即使在maven打包的时候生成spring-configuration-metadata.json,如下
我们打开看下内容
可以看出来它其实就是提取了properties文件类型,重新组织成了一个json文件。
该文件的作用就是当我们在spring配置文件中配置的时候会根据该文件生成提示。
然后配置好jar包坐标
至此,你就拥有了一个自己的starter,将该starter上传至镜像库,就算完成了。
上传jar包至maven中央仓库可参考我的上篇博客
如何上传自己的jar包到maven中央仓库
最后
以上就是时尚人生为你收集整理的如何凭借spring的spi机制制作自己的starter的全部内容,希望文章能够帮你解决如何凭借spring的spi机制制作自己的starter所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复