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

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

(0)

相关推荐

  • SpringBoot自定义starter实例代码

    一.简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入SpringBoot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能.即使是这样,SpringBoot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对SpringBoot的使用. 下面话不多说了,来一起看看详细的介绍吧 二.如何自定义starter 1.实例 如何编写自动配置 ? 我们参照@WebMvcAutoConfigurati

  • spring boot 自定义starter的实现教程

    spring boot 使用 starter 解决了很多配置问题, 但是, 他是怎么来解决这些问题的呢? 这里通过一个简单的例子, 来看一下, starter是怎么来设置默认配置的. 一. 建 starter 项目 自定义的starter, 项目命名规范是: 自定义名-spring-boot-starter 先来看一下, 我最后的目录结构 1. 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns

  • 深入浅析Spring-boot-starter常用依赖模块

    Spring-boot的2大优点: 1.基于Spring框架的"约定优先于配置(COC)"理念以及最佳实践之路. 2.针对日常企业应用研发各种场景的Spring-boot-starter自动配置依赖模块,且"开箱即用"(约定spring-boot-starter- 作为命名前缀,都位于org.springframenwork.boot包或者命名空间下). 应用日志和spring-boot-starter-logging 常见的日志系统大致有:java.util默认提

  • 深入浅析 Spring Boot Starter

    Spring Boot 简介 Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西.因此就有了Spring Boot框架,它的作用很简单,就是帮我们自动配置.Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置.如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置.另外,Spring Boot还集成了嵌入式的Web服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序. 依赖管理是任何复杂项目的关键部

  • Spring Boot Starters简介及其优劣势

    简介 在启动任何项目(无论是小型项目还是企业级应用程序)之前,其中关键的方面之一是依赖管理,手动为小型应用程序执行依赖管理并不是一项困难的工作,但对于复杂的应用程序,手动管理所有项目依赖并不理想,容易出现许多问题以及浪费时间,而这些时间可以用于项目的其他一些重要方面. Spring Boot背后的基本原理之一就是解决类似的问题.Spring Boot Starter是一套方便的依赖描述符,可以很容易地包含在任何级别的应用程序中.这些Starters作为Spring相关技术的引导过程,我们 不再需

  • Spring Boot 自定义starter的示例代码

    SpringBoot 个人感觉特点: 1)众多库的集合(各种Starter),方便快速构建应用系统. 2)自动配置spring(通过AutoConfiguration机制),简化配置,也方便扩展新的Starter. 3)内嵌web容器,无需WAR部署. 创建一个用maven构建的springboot项目 pom文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht

  • 详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service. RedisConnectionFactory是一个接口,有如下4个具体的实现类,我们通常使用的是JedisConnectionFactory. 在spring boot的配置文件中redis的基本配置如下: # Redis服务器地址 spring.redis.host=192.168.0.58 # Redis服务器连接端口 spring.

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

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

  • SpringBoot项目中使用redis缓存的方法步骤

    本文介绍了SpringBoot项目中使用redis缓存的方法步骤,分享给大家,具体如下: Spring Data Redis为我们封装了Redis客户端的各种操作,简化使用. - 当Redis当做数据库或者消息队列来操作时,我们一般使用RedisTemplate来操作 - 当Redis作为缓存使用时,我们可以将它作为Spring Cache的实现,直接通过注解使用 1.概述 在应用中有效的利用redis缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力. 具体的代码参照该

  • 基于springboot搭建的web系统架构的方法步骤

    从接触springboot开始,便深深的被它的简洁性深深的折服了,精简的配置,方便的集成,使我再也不想用传统的ssm框架来搭建项目,一大堆的配置文件,维护起来很不方便,集成的时候也要费力不少.从第一次使用springboot开始,一个简单的main方法,甚至一个配置文件也不需要(当然我是指的没有任何数据交互,没有任何组件集成的情况),就可以把一个web项目启动起来,下面总结一下自从使用springboot依赖,慢慢完善的自己的一个web系统的架构,肯定不是最好的,但平时自己用着很舒服. 1. 配

  • SpringBoot集成EasyExcel实现Excel导入的方法

    第一次正式的写文章进行分享,如果文章中有什么问题,欢迎大家在文末的群内反馈. 一.背景 为什么会用Easyexcel来做Excel上传 平时项目中经常使用EasyExcel从本地读取Excel中的数据,还有一个前端页面对需要处理的数据进行一些配置(如:Excel所在的文件夹,Excel的文件名,以及Sheet列名.处理数据需要的某些参数),由于每次都是读取的本地的文件,我就在想,如果某一天需要通过前端上传excel给我,让我来进行处理我又应该怎么办呢?我怎么才能在尽量少修改代码的前提下实现这个功

  • SpringBoot中使用Servlet三大组件的方法(Servlet、Filter、Listener)

    本篇主要讲解SpringBoot当中使用Servlet三大组件,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧! 三大组件作用 1.Servlet Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理. Servlet的任务有: 1.接收请求数据:我们都知道客户端请求会被封装成HttpServletRequest对象,里面包含了请求头.参数等各种信息. 2.处理请求:通常我

  • Springboot通过run启动web应用的方法

    目录 一.SpringBootApplication背后的秘密 1.@Configuration 2.@ComponentScan 3.@EnableAutoConfiguration 自动配置幕后英雄:SpringFactoriesLoader详解 二.深入探索SpringApplication执行流程 总览: 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootApplication public class Application { public st

  • SpringBoot集成JWT实现登陆验证的方法详解

    1:首先,我们需要在项目中导入两个依赖: <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifa

  • SpringBoot整合EasyExcel进行大数据处理的方法详解

    目录 EasyExcel 需要的Maven 基础读案例 操作的excel 实体类 读取监听器 测试 基础写案例 实体类 测试 Excel模板方式 准备模块 实体类 测试 EasyExcel EasyExcel文档 我用过Poi和EasyPoi这些工具总体来说: POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点 EasyPoi基于POI 的二次封装,解决了大部分的常用场景,简化了代码,但是特别复杂表格处理还是不行,而且性能的话和poi差不多,简单来说就是简化了Poi的操作,少

  • springboot之Jpa通用接口及公共方法使用示例

    目录 springboot  Jpa通用接口,公共方法de 简单使用 pom文件加入jpa 建立model/domain 基本接口BaseRepository 重写JpaRepositoryFactoryBean springboot  Jpa通用接口,公共方法de 简单使用 pom文件加入jpa 这是我的例子使用的依赖.jpa必须当然... 建立model/domain 首先起码建立2个model/domain.就是entity啦.才能看的出效果.随意,应该不需要再描述了.最简单的用法就是直接

  • SpringBoot处理接口幂等性的两种方法详解

    目录 1. 接口幂等性实现方案梳理 1.1 基于 Token 1.2 基于请求参数校验 2. 基于请求参数的校验 在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方案,接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其实都会遇到.今天我们来看看两种比较简单的实现思路. 1. 接口幂等性实现方案梳理 其实接口幂等性的实现方案还是蛮多的,我这里和小伙伴们分享两种比较常见的方案. 1.1 基于 Token 基于 Token 这种方案的实现思路很简单,整个流程分两步:

随机推荐