如何凭借spring的spi机制制作自己的starter

背景:

        前面讲到了如何修改开源工具源码,上传至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中央仓库

 

        

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值