自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

70842479ba6310bfdfcc08121c0c00b0.png

1.前言

随着Spring的日渐臃肿,为了简化配置、开箱即用、快速集成,Spring Boot 横空出世。目前已经成为 Java 目前最火热的框架了。平常我们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器, 因为Spring mvc组件集成了spring-boot-starter-tomcat 。但是现在undertow servlet容器的性能非常好。我们可以通过以下方式先排除tomcat:

479dcd6cc25720da04742a56370bdfea.png

然后直接替换为undertow:

2c7620bed519261468a8be41a58455d2.png

代码无需更改。这就是组件化后的好处:1.可插拔。2.可定制。3.按需集成。为什么能够做到快速适配?我们试想一个这样一个场景:假如你的汽车轮子上有个螺丝坏了,你要买一个螺丝去自己装。你去店里只要报上你汽车的品牌和位置老板就能准确地知道你要用哪种螺丝。这就是标准已经制定好的好处。如果没有标准,你很容易买到不配套的螺丝,你要不停的试错。这显然不是你想要的。如果把这种标准潜移默化,那么我们在沟通上就更加快捷方便。有时候你女朋友一个眼神你就知道她想要干什么。所以Spring Boot 有一个“约定大于配置”的规则,让程序组件之间来减少配置,降低复杂性。因此你在开发一个自定义的Spring Boot Starter的时候也最好考虑你的starter如何达到以上的便利性。

2. Spring Boot的一些约定

一个组件的设计一定要有标准和规则。Spring Boot Starter也不例外。我们来看看一些常规的做法。

2.1 命名风格

如果你快有孩子了,出生前你比较急的一定是起个名字。姓名标识着你和你爱人的血统,一定不会起隔壁老王的姓氏,肯定会招来异样的眼光。在maven中,groupId代表着姓氏,artifactId代表着名字。Spring Boot也是有一个命名的建议的。groupId不要用官方的org.springframework.boot

而要用你自己独特的。对于artifactId的命名,Spring Boot官方建议非官方的Starter命名格式遵循 xxxx-spring-boot-starter ,例如 mybatis-spring-boot-starter 。官方starter会遵循spring-boot-starter-xxxx ,例如上面提到的spring-boot-starter-undertow 。很多开源starter作者会忽略这种约定,显得不够“专业“。

3. 自定义一个Starter

接下来我们构建一个自定义的第三方短信starter,命名为sms-spring-boot-starter 。有一些细节问题需要边写边来介绍。下面是一个省略了samples和test模块模版:

ec9b6547c58d5a07c25d3cd0f61e0e8d.png

依据上面我们建立如下项目:

75a60c0b1a3bb9ecad0bb70696bc8e83.png

3.1 sms-spring-boot

sms-spring-boot构建一个项目重要的就是依赖管理。所以引入BOM是必要的。主要管理该starter的所有模块module,以及starter的所有依赖甚至sms-spring-boot-autoconfigure都由sms-spring-boot管理。

3.2 autoconfigure

该模块主要用来定义配置参数、以及自动配置对外暴露的功能(一般是抽象的接口Spring Bean)。

3.2.1 Properties配置

一般配置参数都是在Spring Boot 的application.yml中。我们会定义一个前缀标识来作为名称空间隔离各个组件的参数。对应的组件会定义一个XXXXProperties 来自动装配这些参数。自动装配的机制基于@ConfigurationProperties注解,请注意一定要显式声明你配置的前缀标识(prefix)。我们的sms-spring-boot会作如下配置:

6fd6afe86972f7a5de08a9fbcb0b2ca0.png

以上以阿里云的短信功能为例作配置,在将来使用时只需要在application.yml中加入上面对应SmsProperties的配置:

19787625f845fdb53acce197109af27f.png

如果你集成了Spring Boot 校验库 你也可以对SmsProperties进行校验。在配置application.yml时细心的java开发者会发现参数配置都有像下面一样的参数描述:

3392dd4f3a05cea57aa07bba5e1ab2b3.png

就像java中的注释一样方便我们理解该配置的作用,其实这个就是java注释生成的。你需要依赖

3fc5ef6245af4a9ee75fa001addbf6d8.png

然后就该依赖会对SmsProperties 成员属性的注释进行提取生成一个spring-configuration-metadata.json文件,这就是配置描述的元数据文件。Spring Boot官方也对注释进行了一些规则约束:

  • 不要以“The”或“A”开头描述。
  • 对于boolean类型,请使用“Whether" 或“Enable”开始描述。
  • 对于基于集合的类型,请使用“Comma-separated list”
  • 如果默认时间单位不等同于毫秒,则使用java.time.Duration而不是long描述默认单位,例如“如果未指定持续时间后缀,则将使用秒”。
  • 除非必须在运行时确定,否则不要在描述中提供默认值。

补充我个人建议描述尽量使用英文描述。

3.2.2 配置自动暴露功能接口

拿到配置后,接下来就是根据配置来初始化我们的功能接口,我们会抽象一个短信发送接口SmsSender,根据短信提供方的SDK来进行功能设计。请注意autoconfigure模块的依赖几乎都是不可传递的。也就是依赖坐标配置optional为true 。功能接口实现完后我们会编写一个自动配置类 SmsAutoConfiguration 。除了@Configuration注解外,@ConfigurationProperties会帮助我们将我们的配置类

SmsProperties加载进来。然后将我们需要暴露的功能接口声明为Spring Bean 暴露给Spring Boot应用 。

有时候我们还可以通过一些条件来控制SmsAutoConfiguration或者SmsSender ,比如根据某个条件是否加载或加载不同的

SmsSender。有时间你可以看看redis-starter就能很明显感觉到,它会根据luttuce、redisson、jedis 的变化实例化不同的客户端链接。实现方式是使用了@Conditional系列注解,有时间可以学习一下该系列的注解。好了我们的SmsAutoConfiguration声明如下:

b519ed64a0ce6ac48282ce9c0d62d5f9.png

3.2.3 主动生效和被动生效

starter集成入应用有两种方式。我们从应用视角来看有两种:

  • 一种是主动生效,在starter组件集成入Spring Boot应用时需要你主动声明启用该starter才生效,即使你配置完全。这里会用到@Import注解,将该注解标记到你自定义的@Enable注解上:

766d3747447a76354bd0f0fa11456b4c.png

我们将该注解标记入Spring Boot应用就可以使用短信功能了。

  • 另一种被动生效,在starter组件集成入Spring Boot应用时就已经被应用捕捉到。这里会用到类似java的SPI机制。在autoconfigure资源包下新建META-INF/spring.factories写入SmsAutoConfiguration全限定名。

a68767095fd6611e78f877fc0c5e0861.png

多个配置类逗号隔开,换行使用反斜杠。

3.3 sms-spring-boot-starter

该模块是一个空jar。它唯一目的是提供必要的依赖项来使用starter。你可以认为它就是集成该starter功能的唯一入口。不要对添加启动器的项目做出假设。如果您自动配置的依赖库通常需要其他启动器,请同时提及它们。如果可选依赖项的数量很高,则提供一组适当的默认依赖项可能很难,因为您应该避免包含对典型库的使用不必要的依赖项。换句话说,您不应该包含可选的依赖项。

无论哪种方式,您的starter必须直接或间接引用核心Spring Boot启动器(spring-boot-starter)(如果您的启动器依赖于另一个启动器,则无需添加它)。如果只使用自定义启动器创建项目,则Spring Boot的核心功能将通过核心启动器的存在来实现。

我们的sms-spring-boot-starter仅仅是以下的pom:

2bc536af1a51dd579a84193cd0e6fe43.png


到此为止,我们的整个短信Starter就开发完成了。

4. 总结

自定义starter对于我们项目组件化、模块化是有很大帮助的。同时也是Spring Boot一大特色。相信通过小胖的介绍你已经蠢蠢欲试了,那么就赶紧开始写一个吧。如果觉得对你有用可以点个赞关注一下。

原文:https://mp.weixin.qq.com/s/ezz1zQ6O4qV4pwqz1UjdTg
作者:码农小胖哥
来源:微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评

大家好,我是胖虎。今天,写一写我当初买的第一把机械键盘「ikbc c87 茶轴」,非常好的入门级樱桃轴键盘,手感和键帽都很不错。ikbc c87 茶轴机械键盘小白,第一款入门级机械键盘买什么?这款ikbc c87和高斯 87C…

dotnet cli 5.0 新特性——dotnet tool search

dotnet cli 5.0 新特性——dotnet tool searchIntro.NET 5.0 SDK 的发布,给 dotnet cli 引入了一个新的特性,dotnet tool search,主要用于搜索 Nuget 上的 dotnet tool,这个命令会搜索 tool 的名称以及一些元数据, tit…

localhost 已拒绝连接_MySQL连接错误:Access denied for #x27;root#x27;@#x27;localhost#x27;

问题描述:笔者在Mac安装MySQL,但是当我连接到localhost本地服务器却被拒绝mysql -u root -p(1045, "Access denied for user rootlocalhost (using password: YES)")根据MySQL的反馈,可以得知,我输入的root密码应该不对…

ncl 添加点shp文件_气象编程 | NCL高效快速精准提取不规则区域内的格点数据

添加新云天气象主编微信或QQ:130188121,及时获取或发布气象升学、就业、会议、征稿及学术动态等信息!通常情况下,要获取某个区域内的格点数据,如果要求不是很高,直接采取矩形框挑选方法——即锁定所需范围内…

2021技术领域趋势报告:Rust继续增长、低代码是重要趋势

喜欢就关注我们吧!OReilly 发布了一份《2021 年编程、运维、AI 和云计算的发展方向》报告,该报告基于 OReilly 在线学习平台产生的数据,就技术行业的趋势进行了一番分析。编程语言方面,报告从使用情况、使用量的同比增长以及搜索查…

python中list的意思_list在python中是什么意思

序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 Python有6个序列的内置类型,但最常见的是列表和元组。 序列都可以进行的操作包括索引&a…

cad必练10张图_CAD比例问题大详解!赶紧收藏!

下面我们来按照从小白的起点学习比例问题:对于比例问题,最关键的一点,就是要弄明白「现实世界」「CAD 的虚拟模型空间」「打印出来的图纸」这三个世界之间的关系。弄明白了这个,一切就迎刃而解了。「现实世界」和「打印出来的纸质…

腾讯招.NET5,居然要求精通MySQL,而不是SQLServer!

春节将至,短暂的2020年正式要宣告结束,展望2021,可谓风起云涌,可以预见.NET5和云原生将是大热话题,NET开发者该如何把握机遇?逛逛招聘网站,看看大厂招聘,这是市场风向标。该学习的东…

32位mysql安装包_MySQL安装指南(CPT103)

随着CPT课程逐步开课,小猿发现了Online 大概等于 Self Learning 的状况,IT相关课程的学生们只能野蛮生长了(悲)。MySql作为一款应用级的软件,在Windows系统上安装过程比较繁琐,写篇文章帮大家避些小猿踩过的坑。MySQL收费&#xf…

Apache ECharts顺利毕业,成为ASF顶级项目

喜欢就关注我们吧!1 月 26 日晚,Apache 基金会官方宣布 ECharts 项目正式毕业,成为 Apache 顶级项目。ECharts 是一款基于 JavaScript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的…

契税申报期限_税局正式公告!财产和行为税合并纳税申报!附税种申报要点

税局正式公告!财产和行为税合并纳税申报!安徽省、重庆市等地,11月23日都发布了《关于实行财产和行为税合并纳税申报的公告》一、申报方式:财产和行为税合并申报 二、申报税种:申报缴纳城镇土地使用税、房产税、车船税、…

c++ 多重背包状态转移方程_【考前再叮嘱】陌生方程式书写

点击上方蓝字 关注“爱学化学”今日分享陌生方程式书写作者|何佳欢 它来了,它真的来了,万众瞩目的期中考试正在缓缓向我们走来,纵观往年试题,陌生方程式书写绝对是众多考点中的C位,尤其是陌生的氧化还原反应方程式书…

网络被屏蔽了怎么办_预埋的网线不够长,怎么办?

前几天直播的时候,有很多朋友发弹幕问小泽,家里预埋的网线发现不够长怎么办?还有些朋友问家里的线不小心被弄断了怎么办?对于这些网线不够长或者网线断了的问题,其实很简单,小泽总结出三种简单的方法。不同…

推荐:Redis桌面管理工具RedisDesktopManager

背景大家平常在开发的时候,Redis 肯定是必不可少的,那么平常使用的时候,我们就需要一款合适的IDE来操作,以提高效率。下面推荐下RedisDesktopManager 。简介Redis Desktop Manager官方版是一款简单快速、跨平台的Redis桌面管理工具…

python getattr_详解 Python 的二元算术运算,为什么说减法只是语法糖?

原题 | Unravelling binary arithmetic operations in Python作者 | Brett Cannon译者 | 豌豆花下猫(“Python猫”公众号作者)声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。大家对我解读属性访问的博客文…

echarts 地图自定义图标_DMKB08:Echarts 分段设色

为了丰富DataMap的可视化效果,集成了百度的Echarts本文讲解Echarts分段设色。关于Echarts可以浏览官网:Apache ECharts (incubating)​echarts.apache.org【A】操作步骤1、主控切换到eCharts2、数据模板,NF009开始有数个模板,可以…

.net:设计一个web应用

web应用相对desktop应用就要复杂一些,桌面应在一个时间点是为单访问服务,web应用,在一个时间点,设计的是为多人服务;桌面应用UI和后面代码是一体的,在一台设备上动行表示,但web服务,…

case when影响性能吗_字段为NULL会影响查询性能吗?

导读假设这个用户中心系统是一个交友平台的一个子系统,现在产品想要提供一个按生日区间筛选用户的功能。那么,要实现这个功能,我们需要写这么一条SQL:SELECT 为了保证这条SQL的查询性能,我们会给用户表中的birthday字段…

c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...

前面花了两篇文章来介绍词法分析和语法分析,接下来才是比较有意思的部分——一个小型类C编译器的设计和实现(其实是编译原理的课程设计啦!~)我用的是python2.7.13PyQt来做的。。。事实上,正是从编译原理课程设计开始&a…

ansys fluent udf manual 下载_FLUENT流固耦合柱体结构涡激振动仿真案例解析

作者 | 陈东阳博士 仿真秀科普作者一、柱体结构涡激振动定义对于海洋工程、风工程上普遍采用的圆柱形断面结构物,流体绕过柱体时会产生交替发放的泻涡,这种交替发放的泻涡又会在柱体上生成顺流向及横流向周期性变化的脉动压力。如果此时柱体是弹性支撑的…