自定义依赖注解无效_最详细的自定义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,一经查实,立即删除!

相关文章

问题解答集

目录 问题解答集 1 目录 2 修订历史纪录 3 1 什么是.net 4 1.1 .net的定义 4 1.2 什么是C# 4 1.3 C#与C,C的相同之处 5 2 有关Update程序 6 2.1 WinForm中Button控件的使用 6 2.2 将double类型的变量保留固定位数的小数部分 7 …

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

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

如何在 ASP.Net Core 中使用 条件中间件

ASP.Net Core 是微软开源的跨平台、可扩展、轻量级的模块化框架,可用于构建高性能的web应用程序。中间件组件可以注入到 ASP.Net Core 请求管道中实现对 Request 和 Response 的定制和修改。ASP.Net Core 中间件可以用于检查、路由或者修改流转于Pipeline的Request和…

solidity payable_以太坊区块链搭建与使用(五)-智能合约Solidity

一、智能合约Solidity开发工具1、remix-ide http://remix.ethereum.org/ 在线版本,也可以去github下载安装到本地。开发、编译、发布、执行、测试2、remix-ide-cn http://remix.hubwiz.com/ 在线中文版本,也可以去github下载安装到本地。支持开发、编译、…

Disable anchor tag的javascript代码(兼容IE和Firefox)

对于anchor tags(<a></a>)&#xff0c;IE支持一个非标准的"disabled"属性&#xff0c;但支持也不完善&#xff0c;比如&#xff0c;如果这个anchor tage没有 "href" 值&#xff0c;IE会把这个anchor设置为灰色&#xff0c;当然不能点击&#x…

大气校正后的ndvi_大气校正常见错误处理方法及校正后检查

本文汇总了ENVI FLAASH大气校正模块中常见的错误&#xff0c;并给出解决方法&#xff0c;分为两部分&#xff1a;运行错误和结果错误。前面是错误提示及说明&#xff0c;后面是错误解释及解决方法。FLAASH对输入数据类型有以下几个要求&#xff1a;1、波段范围&#xff1a;卫星…

dotnet cli 5.0 新特性——dotnet tool search

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

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

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

汇率升值与通货膨胀

[注]:本文首发于我的个人博客——FantasySoft&#xff08;个人博客所在的服务器IP被封&#xff0c;郁闷中&#xff09; 花了一个下午时间&#xff0c;总算搬过来了&#xff0c;欢迎各位光临&#xff01; 12月5日&#xff0c;为期三天的中央经济工作会议在北京闭幕。接着&#x…

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

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

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

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

面试:一分钟自我介绍

一段短短的自我介绍&#xff0c;其实是为了揭开更深入的面谈而设的。一分钟的自我介绍&#xff0c;犹如商品广告&#xff0c;在短短六十秒内&#xff0c;针对“客户”的需要&#xff0c;将自己最美好的一面&#xff0c;毫无保留地表现出来&#xff0c;不但要令对方留下深刻的印…

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

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

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

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

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

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

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

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

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

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

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

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

【转】我们到底为了什么钻研技术?

我们到底为了什么钻研技术?在努力工作、学习了5年之后&#xff0c;1-2-3最近突然感觉有些迷茫&#xff1a;我们钻研技术到底是为了什么&#xff1f;作技术能走多远&#xff1f;1-2-3写下了自己的一些感想&#xff0c;也期待着你的精彩留言.... 程序员真是一个特殊的群体。白天…

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

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