SpringBoot—自定义starter(sms)

SpringBoot—自定义starter(阿里云短信服务)

引言

什么是阿里云短信服务?

在这里插入图片描述

注册和使用阿里云短信服务

  1. 登录阿里云账号
  2. 开通RAM子账号给予短信服务的权限
  3. 登录子账号打开短信服务
使用短信服务

短信签名:短信签名是短信服务提供的一种快捷、方便的个性化签名方式。当发送短信时,短信平台会根据设置,在短信内容里附加个性签名,再发送给指定手机号码。
在这里插入图片描述
短信模板:阿里云肯定不会允许你随意发送短信,因此会要求你提前定义好短信发送的内容。当然,内容中允许出现一些参数变量,但基本内容是固定的,这样的一套定义好的短信内容,就是短信模板
在这里插入图片描述

短信服务如何实现?

传统方式

在这里插入图片描述
缺点:代码耦合、代码冗余、代码维护麻烦

如何解决?

方法一:基于消息队列改为异步调用
在这里插入图片描述
方法二:- 抽取自定义启动器(starter)
在这里插入图片描述
本篇主要讲述方法二的使用

自定义短信服务starter实现

在这里插入图片描述
开发步骤:
自定义启动器:

  1. 创建工程:aliyun_springboot_starter 自定义启动器(集成阿里云服务)
  2. 在pom.xml导入阿里云相关坐标信息 lombok等
  3. 提供属性类(SmsProperties)读取配置文件中相关阿里云SMS短信服务相关参数
  4. 抽取工具类(SmsTemplate)抽取给指定用户发送短信方法-参考阿里云官方文档
  5. 新建自动配置类(SmsAutoConfiguration)注册模板对象(将模板对象加入到IOC容器中)
  6. 在resources目录下新建META-INF文件夹 文件夹下创建文件spring.factories文件-将来springboot会扫描每个jar包中包含该文件

使用步骤:

  1. 在pom.xml中引入自定义starter的依赖
  2. 在application.yml中增加阿里云短信服务需要账号信息
  3. 直接注入SmsTemplate模板对象 ,调用发送短信工具方法完成发送短信业务

代码实现

新建model
在这里插入图片描述
引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--阿里云短信服务-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.4</version>
        </dependency>
    </dependencies>

编写属性类绑定配置文件SmsProperties

@Data
@ConfigurationProperties(prefix = "aliyun.sms")// 绑定配置文件中该前绰的配置
public class SmsProperties {
    /**
     * 访问阿里云服务访问ID
     */
    private String accessId;
    /**
     * 访问阿里云服务访问秘钥
     */
    private String accessKeySecret;

    /**
     * 访问阿里云短信服务接口地址
     */
    private String endpoint;

    /**
     * 阿里云短信签名-名称
     */
    private String signName;
}

编写工具类SmsTemplate

public class SmsTemplate {
    @Autowired
    private com.aliyun.dysmsapi20170525.Client client;
    @Autowired
    private SmsProperties smsProperties;
    /**
     * 发送短信
     * @param mobile 手机号,多个手机号之间使用逗号隔开,手机号个数不要超过1000
     * @param templateCode 模板code 决定短信内容
     * @param templateParam 模板参数 短信内容中动态变量占位  注意:该字符串为JSON格式
     * @return boolean   返回true:发送短信超过    返回false:发送短信失败
     */
    public Boolean sendSms(String mobile, String templateCode, String templateParam) {
        //ctrl + alt +t ---》选择 try catch
        try {
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setPhoneNumbers(mobile)
                    .setSignName(smsProperties.getSignName())
                    .setTemplateCode(templateCode)
                    .setTemplateParam(templateParam);
            SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
            String code = sendSmsResponse.getBody().getCode();
            if ("OK".equals(code)) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }
}

编写sms配置类SmsConfig

@Configuration
@EnableConfigurationProperties(SmsProperties.class)
public class SmsConfig {
    @Autowired
    private SmsProperties smsProperties;

    @Bean
    public com.aliyun.dysmsapi20170525.Client client() {
        try {
            Config config = new Config()
                    // 您的AccessKey ID
                    .setAccessKeyId(smsProperties.getAccessId())
                    // 您的AccessKey Secret
                    .setAccessKeySecret(smsProperties.getAccessKeySecret());
            // 访问的域名
            config.endpoint = smsProperties.getEndpoint();
            return new com.aliyun.dysmsapi20170525.Client(config);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

编写自动配置类

@Configuration
@ConditionalOnClass(SendSmsRequest.class)  //只有导入阿里云相关jar包(才会有某些发送短信class)
@Import(SmsConfig.class)  //引入某个配置类
public class SmsAutoConfiguration {

    @Bean // 将工具类导入IOC容器
    @ConditionalOnMissingBean(name = "smsTemplate")
    public SmsTemplate smsTemplate(){
        return new SmsTemplate();
    }

}

编写自动装配文件
spring.factories
在resource/META-INF新建该配置文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.cjd.config.SmsAutoConfiguration

编写完成,将该start安装到本地仓库
在这里插入图片描述
测试即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值