当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot封装自己的Starter的实现方法

SpringBoot封装自己的Starter的实现方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

一.说明

我们在使用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);
  }
}

项目源码:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网