如何使用SpringBoot封装自己的Starter
作者:sans_
juejin.im/post/5cb880c2f265da03981fc031
一.说明
我们在使用springboot的时候常常要引入一些starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度。
所以在用xxx-starter的时候,可以不用费心去写一些繁琐的配置文件,即使必要的配置在application.properties或application.yml中配置就可以了,当你实现了一个starter,可以在不同的项目中复用,非常方便,今天我们来编写自己的starter以之前的短信业务为例。
参考:https://juejin.im/post/5cb165486fb9a068a60c2827
spring-boot-starter-xxx是官方提供starter的命名规则,非官方starter的命名规则官方建议为 xxx-spring-boot-starter
二.搭建项目
建立springboot项目,清除resources下的文件和文件夹
maven依赖如下:
<dependencies>
<!--封装starter核心依赖 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-autoconfigure</artifactid>
<version>2.1.3.release</version>
</dependency>
<!--非必需,该依赖作用是在使用idea编写配置文件有代码提示-->
<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>
spring-boot-configuration-processor不是必须的,它的作用是和编译时生成 spring-configuration-metadata.json,此文件主要给idea使用。
配置此jar相关配置属性在 application.yml中,你可以用ctrl+鼠标左键点击属性名,ide会跳转到你配置此属性的类中,并且编写application.yml会有代码提示。
三.编写项目基础类
创建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);
}
}
项目源码:
https://gitee.com/liselotte/sms-spring-boot-starter
推荐阅读(点击即可跳转阅读)
2. 面试题内容聚合
3. 设计模式内容聚合
4. mybatis内容聚合
5. 多线程内容聚合
推荐阅读
-
SpringBoot如何优雅的使用RocketMQ
-
如何使用Vue的思想封装一个Storage
-
如何优雅的使用springboot项目内置tomcat
-
springboot手写一个自己的starter源码
-
SpringBoot整合rabbitMQ,spring-boot-starter-amqp 的使用
-
Springboot如何获取配置文件application.yml中自定义的变量并使用
-
如何将自己的python代码发布在pip install给别人使用你知道吗
-
SpringBoot是如何使用SQL数据库的?
-
javascript如何封装自己的js插件?(简单教程)
-
如何在springboot中扩展springmvc的功能以及使用拦截器