SpringBoot封装自己的Starter的实现方法
一.说明
我们在使用springboot的时候常常要引入一些starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度,所以在用xxx-starter的时候,可以不用费心去写一些繁琐的配置文件,即使必要的配置在application.properties或application.yml中配置就可以了,当你实现了一个starter,可以在不同的项目中复用,非常方便,今天我们来编写自己的starter以之前的短信业务为例。
springboot短信业务调用:
spring-boot-starter-xxx是官方提供starter的命名规则,非官方starter的命名规则官方建议为 xxx-spring-boot-starter
二.搭建项目
建立springboot项目,清除resources下的文件和文件夹
maven依赖如下:
<dependencies> <!--封装starter核心依赖 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter</artifactid> <version>2.1.3.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-autoconfigure</artifactid> <version>2.1.3.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-configuration-processor</artifactid> <version>2.1.3.release</version> </dependency> <!-- lombok 插件 --> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.6</version> <optional>true</optional> </dependency> <!-- 因为要使用resttemplate和转换json,所以引入这两个依赖 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <version>2.1.3.release</version> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.45</version> </dependency> </dependencies>
二.编写项目基础类
创建sendsmsdto传输类,用于参数传递
/** * smsdto参数类 * @author sans * @createtime 2019/4/20 * @attention */ @data public class sendsmsdto { /** * 模板id */ private string templateid; /** * 参数 */ private string param; /** * 手机号 */ private string mobile; /** * 用户穿透id,可以为空 */ private string uid; }
创建resttemplateconfig配置类,用于调用短信接口
/** * resttemplateconfig配置 * @author sans * @createtime 2019/4/20 * @attention */ @configuration public class resttemplateconfig { @bean public resttemplate resttemplate( ) { return new resttemplate(); } }
创建短信接口枚举类,用于存放短信接口api地址
/** * 短信请求api枚举 * @author sans * @createtime 2019/4/20 * @attention */ @getter public enum enum_smsapi_url { sendsms("https://open.ucpaas.com/ol/sms/sendsms"), sendbatchsms("https://open.ucpaas.com/ol/sms/sendsms_batch"); private string url; enum_smsapi_url(string url) { this.url = url; } }
三.编写starter自动配置类
创建smsproperties配置属性类,该类主要用于读取yml/properties信息
/** * sms配置属性类 * @author sans * @createtime 2019/4/20 * @attention 使用configurationproperties注解可将配置文件(yml/properties)中指定前缀的配置转为bean */ @data @configurationproperties(prefix = "sms-config") public class smsproperties { private string appid; private string accountsid; private string authtoken; }
创建短信核心服务类
/** * 短信核心服务类 * @author sans * @createtime 2019/4/20 * @attention */ public class smsservice { @autowired private resttemplate resttemplate; private string appid; private string accountsid; private string authtoken; /** * 初始化 */ public smsservice(smsproperties smsproperties) { this.appid = smsproperties.getappid(); this.accountsid = smsproperties.getaccountsid(); this.authtoken = smsproperties.getauthtoken(); } /** * 单独发送 */ public string sendsms(sendsmsdto sendsmsdto){ jsonobject jsonobject = new jsonobject(); jsonobject.put("sid", accountsid); jsonobject.put("token", authtoken); jsonobject.put("appid", appid); jsonobject.put("templateid", sendsmsdto.gettemplateid()); jsonobject.put("param", sendsmsdto.getparam()); jsonobject.put("mobile", sendsmsdto.getmobile()); if (sendsmsdto.getuid()!=null){ jsonobject.put("uid",sendsmsdto.getuid()); }else { jsonobject.put("uid",""); } string json = jsonobject.tojsonstring(jsonobject); //使用resttemplate进行访问远程http服务 httpheaders headers = new httpheaders(); headers.setcontenttype(mediatype.application_json_utf8); httpentity<string> httpentity = new httpentity<string>(json, headers); string result = resttemplate.postforobject(enum_smsapi_url.sendsms.geturl(), httpentity, string.class); return result; } /** * 群体发送 */ public string sendbatchsms(sendsmsdto sendsmsdto){ jsonobject jsonobject = new jsonobject(); jsonobject.put("sid", accountsid); jsonobject.put("token", authtoken); jsonobject.put("appid", appid); jsonobject.put("templateid", sendsmsdto.gettemplateid()); jsonobject.put("param", sendsmsdto.getparam()); jsonobject.put("mobile", sendsmsdto.getmobile()); if (sendsmsdto.getuid()!=null){ jsonobject.put("uid",sendsmsdto.getuid()); }else { jsonobject.put("uid",""); } string json = jsonobject.tojsonstring(jsonobject); //使用resttemplate进行访问远程http服务 httpheaders headers = new httpheaders(); headers.setcontenttype(mediatype.application_json_utf8); httpentity<string> httpentity = new httpentity<string>(json, headers); string result = resttemplate.postforobject(enum_smsapi_url.sendbatchsms.geturl(), httpentity, string.class); return result; } }
创建smsautoconfiguration自动配置类,该类主要用于创建核心业务类实例
/** * 短信自动配置类 * @author sans * @createtime 2019/4/20 * @attention */ @configuration @enableconfigurationproperties(smsproperties.class)//使@configurationproperties注解生效 public class smsautoconfiguration { @bean public smsservice getbean(smsproperties smsproperties){ smsservice smsservice = new smsservice(smsproperties); return smsservice; } }
四.创建spring.factories文件
spring.factories该文件用来定义需要自动配置的类,springboot启动时会进行对象的实例化,会通过加载类springfactoriesloader加载该配置文件,将文件中的配置类加载到spring容器
在src/main/resources新建meta-inf文件夹,在meta-inf文件夹下新建spring.factories文件.配置内容如下:
org.springframework.boot.autoconfigure.enableautoconfiguration=com.sms.starter.config.smsautoconfiguration
五.打包和测试
使用maven插件,将项目打包安装到本地仓库
新建测试项目,引入我们自己的starter,maven依赖如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <!-- 添加我们自己的starter--> <dependency> <groupid>com.sms.starter</groupid> <artifactid>sms-spring-boot-starter</artifactid> <version>0.0.1-snapshot</version> </dependency> </dependencies>
配置测试项目的application.yml
sms-config: account-sid: //这里填写平台获取的id和key auth-token: //这里填写平台获取的id和key appid: //这里填写平台获取的id和key
参数填写自己的手机号和申请的模板以及对应的参数
/** * 测试短信demo * @author sans * @createtime 2019/4/20 * @attention */ @restcontroller @requestmapping("/sms") public class testcontroller { @autowired private smsservice smsservice; /** * 短信测试 * @attention * @author: sans * @createtime: 2019/4/20 */ @requestmapping(value = "/sendsmstest",method = requestmethod.get) public string sendsmstest(){ //创建传输类设置参数 sendsmsdto sendsmsdto = new sendsmsdto(); sendsmsdto.setmobile(""); //手机号 sendsmsdto.settemplateid(""); //模板 sendsmsdto.setparam(""); //参数 return smsservice.sendsms(sendsmsdto); } }
项目源码:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读