自定义 spring boot starter 三部曲之二:实战开发
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本文是《自定义 spring boot starter 三部曲》的第二篇,上一篇中我们通过学习 spring cloud 的 starter,对 spring boot 的 starter 有了初步了解,也设计好了实战内容,今天就来一起实现;
本章内容概述
创建工程 customizestarter;
创建模块 customizeapi;
创建模块 addservice;
创建模块 minusservice;
创建模块 customizeservicestarter;
构建工程 customizestarter,并安装到本地 maven 仓库;
创建工程 customizestartertestdemo;
构建工程 customizestartertestdemo,得到 jar 包;
启动 customizestartertestdemo 工程的 jar 包,并带上一个启动参数,验证支持负数的减法服务;
启动 customizestartertestdemo 工程的 jar 包,验证不支持服务的减法服务;
源码下载
您也可以选择直接从 GitHub 下载 customizestarter 和 customizestartertestdemo 这两个工程的源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章源码分别在 customizestarter 和 customizestartertestdemo 这两个文件夹下,如下图红框所示:
接下来开始开发吧;
创建工程 customizestarter
创建一个名为 customizestarter 的 maven 工程,以**spring-boot-starter-parent</font>作为父工程,同时自身又是后续几个模块的父工程,pom.xml 内容如下:
创建模块 customizeapi
在工程 customizestarter 下创建模块 customizeapi,这是个 java 工程,里面是加法和减法服务的接口,和一个业务异常的定义;
customizeapi 的 pom.xml 内容如下,很简单,只有基本定义:
异常定义类:
加法服务的接口类 AddService:
减法服务定义类,注意减法 API 声明了异常抛出,因为如果已经配置了不支持负数的减法服务,那么被减数如果小于减数就抛出异常:
创建模块 addservice
在工程 customizestarter 下创建模块 addservice,这是个 java 工程,里面包含了加法相服务的实现,pom.xml 内容如下,注意由于要实现加法接口,因此需要依赖模块 customizeapi:
加法接口的实现类 AddServiceImpl 很简单,如下:
创建模块 minusservice
在工程 customizestarter 下创建模块 minusservice,这是个 java 工程,里面包含了减法相服务的实现,pom.xml 内容如下,注意由于要实现减法接口,因此需要依赖模块 customizeapi:
一共有两个减法接口的实现类,第一个不支持负数结果,如果被减数小于减数就抛出异常 MinusException:
第二个减法接口的实现类支持负数返回:
创建模块 customizeservicestarter
在工程 customizestarter 下创建模块 customizeservicestarter,这是个 java 工程,里面需要依赖 spring boot 配置相关的库,由于要在配置中实例化加法和减法服务的实现,因此 customizeapi、addservice、minusservice 这些模块都要在 pom.xml 中声明依赖,如下:
创建配置类 CustomizeConfiguration,注意 getSupportMinusService 和 getNotSupportMinusService 这两个方法上的注解配置,如果环境变量**com.bolingcavalry.supportnegative</font>存在并且等于 true,那么 getSupportMinusService 方法就返回了 MinusService 接口的实例,如果当前环境没有 MinusService 接口的实例,就由 getNotSupportMinusService 方法就返回一个,并且有会在控制台打印创建了哪种实现:
在 src\main\resources 目录下创建一个目录**META-INF</font>,里面创建一个文件 spring.factories,内容是如下,表示如果当前应用支持 spring boot 的自动配置,就会被 spring boot 框架实例化并注册到 spring 容器内:
构建工程 customizestarter
到这里 customizestarter 工程的编码就结束了,在工程内 pom.xml 所在目录(也就是 customizestarter 内的第一层目录),执行以下命令可以编译构建并安装到本地 maven 仓库:
如果编译构建和安装都成功了,可以看到类似如下输出:
现在 starter 已经准备好了,我们做一个 spring boot 的 web 应用来验证一下;
创建工程 customizestartertestdemo
工程 customizestartertestdemo 是个简单的 spring boot 应用,pom.xml 如下,可见并无特别之处,只是多了 customizeservicestarter 的依赖:
开发一个 Controller 类,用于调用 AddService 和 MinusService 对应的服务:
启动类如下:
构建工程 customizestartertestdemo
在 customizestartertestdemo 工程的 pom.xml 所在目录下执行以下命令即可构建成功:
命令执行成功后,即可在 target 目录下见到 customizestartertestdemo-0.0.1-SNAPSHOT.jar 文件,如下图:
现在编码和构建已经全部完成,我们可以来验证了;
验证支持负数的减法服务
在 customizeapi 模块的 CustomizeConfiguration 类中,有如下方法和注解:
从上述代码可见,只要环境变量"com.bolingcavalry.supportnegative"等于 true,注册到 spring 容器的就是 MinusServiceSupportNegativeImpl 类的实例;
customizestartertestdemo-0.0.1-SNAPSHOT.jar 文件所在目录下,执行以下命令启动应用:
在控制台中可以看见**create minusService support minus</font>,表示注册到 spring 容器的是 MinusServiceSupportNegativeImpl 类的实例,如下所示:
在浏览器访问 http://localhost:8080/minus/1/2,可见返回计算结果为负数:
验证不支持负数的减法服务
前面已经分析过,CustomizeConfiguration 类的 getNotSupportMinusService 方法执行的条件是环境变量"com.bolingcavalry.supportnegative"等于 true,如果没有这个环境变量,getNotSupportMinusService 方法就不会执行,spring 容器中就没有 MinusService 接口的实例;
CustomizeConfiguration 类中,有如下方法和注解:
从上述代码可见,spring 容器中如果没有 MinusService 接口的实例,getNotSupportMinusService 方法就会被执行,在 spring 容器中注册 MinusServiceNotSupportNegativeImpl 实例;
因此接下来的我们启动的应用如果没有环境变量"com.bolingcavalry.supportnegative",就可以使用到不支持负数的减法服务了;
停掉之前启动的应用,然后执行以下命令启动应用:
在控制台中可以看见**create minusService not support minus</font>,表示注册到 spring 容器的是 MinusServiceNotSupportNegativeImpl 类的实例,如下所示:
在浏览器访问 http://localhost:8080/minus/1/2,由于 MinusServiceNotSupportNegativeImpl 实例不支持负数减法,会直接抛出异常,如下图:
至此,自定义 spring boot starter 的编码实战就完成了,希望本篇可以给您用来作参考,助您做出自己所需的 starter;
下一篇我们一起去看看 spring boot 的源码,对这个高效的扩展功能做更深入的了解;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/7c815b6a8f8df08b79ad5c9b4】。文章转载请联系作者。
评论