随着Spring的日渐臃肿,为了简化配置、开箱即用、快速集成,Spring Boot 横空出世。 目前已经成为 Java 目前最火热的框架了。日常咱们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器, 由于Spring mvc组件集成了spring-boot-starter-tomcat 。可是如今undertow servlet容器的性能很是好。咱们能够经过如下方式先排除tomcat:java
而后直接替换为undertow:web
代码无需更改。这就是组件化后的好处:1.可插拔。2.可定制。3.按需集成。为何可以作到快速适配?咱们试想一个这样一个场景:假如你的汽车轮子上有个螺丝坏了,你要买一个螺丝去本身装。你去店里只要报上你汽车的品牌和位置老板就能准确地知道你要用哪一种螺丝。这就是标准已经制定好的好处。若是没有标准,你很容易买到不配套的螺丝,你要不停的试错。这显然不是你想要的。 若是把这种标准潜移默化,那么咱们在沟通上就更加快捷方便。有时候你女友一个眼神你就知道她想要干什么。因此Spring Boot 有一个“约定大于配置”的规则,让程序组件之间来减小配置,下降复杂性。所以你在开发一个自定义的Spring Boot Starter的时候也最好考虑你的starter如何达到以上的便利性。redis
一个组件的设计必定要有标准和规则。Spring Boot Starter也不例外。咱们来看看一些常规的作法。spring
若是你快有孩子了,出生前你比较急的必定是起个名字。姓名标识着你和你爱人的血统,必定不会起隔壁老王的姓氏,确定会招来异样的眼光。在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做者会忽略这种约定,显得不够“专业“。json
接下来咱们构建一个自定义的第三方短信starter,命名为sms-spring-boot-starter 。有一些细节问题须要边写边来介绍。下面是一个省略了samples和test模块模版:segmentfault
依据上面咱们创建以下项目:tomcat
sms-spring-boot构建一个项目重要的就是依赖管理。因此引入BOM是必要的。主要管理该starter的全部模块module,以及starter的全部依赖甚至sms-spring-boot-autoconfigure都由sms-spring-boot管理。mybatis
该模块主要用来定义配置参数、以及自动配置对外暴露的功能(通常是抽象的接口Spring Bean)。mvc
通常配置参数都是在Spring Boot 的application.yml中。咱们会定义一个前缀标识来做为名称空间隔离各个组件的参数。对应的组件会定义一个XXXXProperties 来自动装配这些参数。自动装配的机制基于@ConfigurationProperties注解,请注意必定要显式声明你配置的前缀标识(prefix)。咱们的sms-spring-boot会做以下配置:app
以上以阿里云的短信功能为例做配置,在未来使用时只须要在application.yml中加入上面对应SmsProperties的配置:
若是你集成了Spring Boot 校验库 你也能够对SmsProperties进行校验。在配置application.yml时细心的java开发者会发现参数配置都有像下面同样的参数描述:
就像java中的注释同样方便咱们理解该配置的做用,其实这个就是java注释生成的。你须要依赖
而后就该依赖会对SmsProperties 成员属性的注释进行提取生成一个spring-configuration-metadata.json文件,这就是配置描述的元数据文件。Spring Boot官方也对注释进行了一些规则约束:
补充我我的建议描述尽可能使用英文描述。
拿到配置后,接下来就是根据配置来初始化咱们的功能接口,咱们会抽象一个短信发送接口SmsSender,根据短信提供方的SDK来进行功能设计。请注意autoconfigure模块的依赖几乎都是不可传递的。也就是依赖坐标配置optional为true 。
功能接口实现完后咱们会编写一个自动配置类 SmsAutoConfiguration 。除了@Configuration注解外,@ConfigurationProperties会帮助咱们将咱们的配置类SmsProperties加载进来。而后将咱们须要暴露的功能接口声明为Spring Bean 暴露给Spring Boot应用 。有时候咱们还能够经过一些条件来控制SmsAutoConfiguration或者SmsSender ,好比根据某个条件是否加载或加载不一样的SmsSender。有时间你能够看看redis-starter就能很明显感受到,它会根据luttuce、redisson、jedis 的变化实例化不一样的客户端连接。实现方式是使用了@Conditional系列注解,有时间能够学习一下该系列的注解。好了咱们的SmsAutoConfiguration声明以下:
starter集成入应用有两种方式。咱们从应用视角来看有两种:
咱们将该注解标记入Spring Boot应用就可使用短信功能了。
多个配置类逗号隔开,换行使用反斜杠。
该模块是一个空jar。它惟一目的是提供必要的依赖项来使用starter。你能够认为它就是集成该starter功能的惟一入口。不要对添加启动器的项目作出假设。若是您自动配置的依赖库一般须要其余启动器,请同时说起它们。若是可选依赖项的数量很高,则提供一组适当的默认依赖项可能很难,由于您应该避免包含对典型库的使用没必要要的依赖项。换句话说,您不该该包含可选的依赖项。
不管哪一种方式,您的starter必须直接或间接引用核心Spring Boot启动器(spring-boot-starter)(若是您的启动器依赖于另外一个启动器,则无需添加它)。若是只使用自定义启动器建立项目,则Spring Boot的核心功能将经过核心启动器的存在来实现。
咱们的sms-spring-boot-starter仅仅是如下的pom:
到此为止,咱们的整个短信Starter就开发完成了。
自定义starter对于咱们项目组件化、模块化是有很大帮助的。同时也是Spring Boot一大特点。相信经过小胖的介绍你已经蠢蠢欲试了,那么就赶忙开始写一个吧。若是以为对你有用能够点个赞关注一下。
关注公众号:码农小胖哥 获取更多资讯