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

 更新时间:2019年04月23日 09:56:06   作者:Sans_  
这篇文章主要介绍了SpringBoot封装自己的Starter的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一.说明

我们在使用SpringBoot的时候常常要引入一些Starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度,所以在用xxx-starter的时候,可以不用费心去写一些繁琐的配置文件,即使必要的配置在application.properties或application.yml中配置就可以了,当你实现了一个Starter,可以在不同的项目中复用,非常方便,今天我们来编写自己的Starter以之前的短信业务为例。

Springboot短信业务调用: https://www.jb51.net/article/160092.htm

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);
  }
}

项目源码: https://gitee.com/liselotte/sms-spring-boot-starter

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

相关文章

  • SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解

    SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解

    这篇文章主要为大家介绍了SpringBoot定时任务动态扩展ScheduledTaskRegistrar类示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 通过实践了解如何处理Java异常

    通过实践了解如何处理Java异常

    Java中的异常处理不是一个简单的主题。初学者发现它很难理解,甚至有经验的开发者也可以花几个小时讨论如何以及应该抛出或处理哪些异常。下面我们通过实践来了解如何解决异常
    2019-05-05
  • SpringCloud Gateway实现API接口加解密

    SpringCloud Gateway实现API接口加解密

    这篇文章主要为大家介绍了SpringCloud Gateway如何实现API接口加解密的,文中的示例代码讲解详细,对我们学习有一定的帮助,需要的可以参考一下
    2022-06-06
  • Springboot整合RabbitMQ消息中间件的使用

    Springboot整合RabbitMQ消息中间件的使用

    在没有特别要求的情况下,通常会选择RabbitMQ作为消息中间件,本文主要介绍了Springboot整合RabbitMQ消息中间件的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java版十大排序经典算法:完整代码(2)

    java版十大排序经典算法:完整代码(2)

    优秀的文章也不少,但是Java完整版的好像不多,我把所有的写一遍巩固下,同时也真诚的希望阅读到这篇文章的小伙伴们可以自己去从头敲一遍,不要粘贴复制!希望我的文章对你有所帮助,每天进步一点点
    2021-07-07
  • Intellij IDEA 添加jar包的三种方式(小结)

    Intellij IDEA 添加jar包的三种方式(小结)

    这篇文章主要介绍了Intellij IDEA 添加jar包的三种方式(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • JAVA获取特定格式时间方式

    JAVA获取特定格式时间方式

    我们有时要获取时间,年月日时分秒周几,有时要以特定的格式出现,本文主要介绍了JAVA获取特定格式时间方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 解决java数值范围以及float与double精度丢失的问题

    解决java数值范围以及float与double精度丢失的问题

    下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 分析xxljob登入功能集成OIDC的统一认证

    分析xxljob登入功能集成OIDC的统一认证

    这篇文章主要为大家介绍分析xxljob登入功能集成OIDC的统一认证的详解说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Java设计模式之23种设计模式详解

    Java设计模式之23种设计模式详解

    这篇文章主要介绍了Java设计模式之23种设计模式详解,设计模式使代码编制真正工程化,设计模式是软件工程的基石,项目中合理的运用设计模式可以完美的解决很多问题,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论