作为一个cv开发工程师,平时应该是很少接触或者有机会自己亲自动手去实现一个,笔者也是一个偶然的机会才自己实现了一个类似hutool一样的工具包,里面有些自己用的比较顺手的工具类,当然还包括咱们今天的主角,好了,废话不多说了,直接进入正题。
我们都知道springboot提供了很多扩展点,以此来展示它的扩展性,今天我们要说的starter其实也是其中实现扩展手段之一
当我们新建一个springboot项目时,就只有一个启动类xxxApplication,相信对于这样一个类作为java后端同学来说应该都不陌生了吧,至少尝试着看springboot源码的时候没少看过,所以对于@SpringBootApplication这个注解应该也是不陌生的,我们都知道这个注解有一个重要的功能就是引入了@EnableAutoConfiguration注解,然后它又引入了一个AutoConfigurationImportSelector类,其实这种模式就是我们今天要实现starter的一种方式,就是通过注解的形式引入所需要的配置类。现在,我们就动手来实现一个自己的starter吧。
首先,我们就用分布式锁的场景来模拟吧,在分布式微服务架构中这是必不可少的,每个服务几乎都有机会会用到,所以这个场景我们就可以抽象成一个starter中的一个功能点;首先,我们需要一个分布式锁的工具类,这个不是我们今天的主题,所以我们一笔带过
上面就是我们实现的获取zk分布式锁的工具类,工具类有了,那接下来就是实现我们的配置类了
这里解释下EnableConfigurationProperties,这个注解的作用就是引入我们的配置项,因为作为zk分布式锁,首先要做的就是连接zk是吧,所以我们这里做了一个配置,在上游使用我们这个zk锁的时候可以进行配置化,然后Configuration就不用说了,这个注解就是标记此类为一个配置类了,这个比较简单就不过多介绍了,最后,最最关键的一步就要来了,配置类有了,接下来我们要如何让springboot发现我们这个配置类呢,而且还要做到可配置,这里的可配置的意思就是我需要的时候就引入,不需要的时候我就保持我代码的清洁性,我就完全不知道zk是个啥玩意,也不要有任何zk的东西出现在我的项目中,这里我们要用到自定义注解,客官请看下图
看到这里,各位看官是不是有点熟悉的感觉呢,对,这不就是之前EnableAutoConfiguration注解引入AutoConfigurationImportSelector类一样的方式吗,所以闭环了,以上这些我们就大致实现了一个自己的分布式锁的starter,接下来我们来看看如何使用,我们新建一个项目,在其启动类上加上我们自定义的注解,当然,连接zk的配置也别忘了;自此我们实现到使用的完整一套流程已经走完了
但是有人可能会有疑问,这种方式虽然做到了可配置,但是必须要通知使用方且要自己加注解的方式,就是说没有快速入门我根本不会呀,没关系,我们还有傻瓜式配置方式,完全在你无感的情况下就已经引入了; 首先,我们在starer项目中的resources配置文件夹中新建一个文件名spring.factories,这里又是一个知识点哦,不懂的同学可以自行百度学习,这里就不详细展开说了,我们直接看文件内容
这里稍微提一下这个EnableAutoConfiguration其实可以理解为springboot的一个扩展点,通过定义一个这样的key的东西,然后它的值就是我们需要springboot发现并加载的自己实现的配置类,这种实现方式其实还有一个别名,就是大名鼎鼎的SPI(service production interface),当你的项目引入starter项目时,springboog就会加载到你这个文件中配置的内容,也就是加载你的配置类,至于加载细节可以去了解下spingboot启动步骤,这里就不详细展开说了,因为这里我们只讨论我们所关注的功能实现,至于底层基础就略过了哈;以上,两种使用starter的方式到这里我们就全部介绍完了,看完之后是不是觉得也就那么回事呢,其实也就是那么个事吧哈哈
最后,希望我的文章对您会有帮助,哪怕工作中用不到,但是知道是怎么回事也不是坏事,毕竟有位名人曾经说过,手上没有剑和有剑不用是两回事!