欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何使用SpringBoot封装自己的Starter

程序员文章站 2022-05-29 09:14:18
作者:Sans_ juejin.im/post/5cb880c2f265da03981fc031 一.说明 我们在使用SpringBoot的时候常常要引入一些Starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度。 所以 ......

作者: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下的文件和文件夹

如何使用SpringBoot封装自己的Starter

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插件,将项目打包安装到本地仓库

如何使用SpringBoot封装自己的Starter

新建测试项目,引入我们自己的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

 

推荐阅读(点击即可跳转阅读)

1. springboot内容聚合

2. 面试题内容聚合

3. 设计模式内容聚合

4. mybatis内容聚合

5. 多线程内容聚合