您现在的位置是:首页 > 文章详情

如何开发自己的Spring Boot Starter

日期:2018-10-28点击:392

我们在使用 Spring Boot 的过程中,往往都是在pom.xml里加了一系列的依赖,然后启支一个包含main方法的Application,一切就OK啦。给你我的感觉,就像是自己要动手做个菜,自己不再需要准备每一部分的原材料,直接购买包装好的一份菜的原料,下锅即可

那我们详细看下,这份「包装好」的原料中,到底做了些什么。

添加Starter依赖

这里添加的依赖,除了我们之前在Maven中熟悉的之外,还有一些都是长这个样子:

名为xxx-starter,比如


img_e1102ca919d03d06c52c61a418421115.png

具体这些starter是怎么起作用的呢,他们什么时候开始工作的?

一切都要从入口处说起。我们以上面的starter为例,看到这个mybatis的starter,其对应的pom中,包含这些依赖


img_9dff084b6a66982e9abb926a9b16b847.png

我们看到,相当于我们添加了一个Starter的依赖,其背后会引入许多其定义的其他依赖,通过 Maven 的传递依赖,这些都会被自动添加了进来。

自动配置

相比传统的依赖,我们看到其中包含这样一个:mybatis-spring-boot-autoconfigure,这也是每个Starter的秘密所在:「AutoConfigure」

它会在实现时,考虑应用中的其他部分因素,「推断」你所需要的 Spring 配置。


img_0db7bdde1240e60230b6a82c8f9ff43f.jpe

在Spring Boot中,我们最大的感受是配置仿佛都被做好了,直接使用即可,这就是

spring-boot-autoconfigure.   每个starter都有一个名为spring.factories

的文件,存放在META-INF目录下,其中的内容类似下面这个样子:


img_4e751daaa9cecfd32db0e025a28b1eab.png

所有需要自动配置的Class,都需要配置成key是EnableAutoConfiguration的。

我们来看类的内部


img_cb981d34cf47a851bbe4afc573b01870.png

Class 之上, 有不少注解来标识,有几点需要关注的:

其中有标准的 Spring 配置注解 @Configuration

几个@ConditionalXX

标识执行顺序的@AutoConfigureAfter

其中,@ConditionalOnClass 标识 SqlSessionFactory类存在时,执行该配置, @ConditionalOnBean标识DataSource Bean在 Spring Context时,执行配置。

这些spring.factories是怎么被识别的呢? 这就得夸下 Spring 的FactoriesLoader了。

看下官方文档说明

img_c98d7c7163af007e710f06336fd3fa0f.png

启动的时候,根据ClassLoader中的jar,扫描所有 spring.factories,将其中符合条件的过滤出来,执行对应的配置。重点可以关注下

AutoConfigurationImportFilter类,

img_22edb86df00874a43f51d6672d89d0ec.png

img_4d74e7fbe7b035a58780906d9f3dd5b2.png

经过这里的执行之后, filter方法把符合条件的过滤出来了。

创建自定义Starter

经过上面两步,我们大概知道 Starter的工作原理。有时候,我们需要对外提供一些工具组件时,也想以 Starter 的形式提供出来,供别人使用。步骤也还算清晰,照葫芦画瓢。

先创建自己的模块

增加需要用到的依赖

创建对应的 AutoConfiguration类

创建META-INF/spring.factories 文件

此时,就不需要再将 Spring Boot 做为 Parent依赖,在单独的依赖中增加


img_62f924d29bd008fb2a7485f53f689bcb.png

AutoConfiguration类也简单,照上面的创建一个


img_5b1aa4e6c93eaf8ed6ad75209d1abef5.png

然后,增加文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.HelloServiceAutoConfiguration

在需要这个服务的地方,直接引入依赖就OK啦。

欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

原文链接:https://yq.aliyun.com/articles/659303
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章