SpringBoot—自定义starter(阿里云短信服务)
引言
什么是阿里云短信服务?
注册和使用阿里云短信服务
- 登录阿里云账号
- 开通RAM子账号给予短信服务的权限
- 登录子账号打开短信服务
使用短信服务
短信签名:短信签名是短信服务提供的一种快捷、方便的个性化签名方式。当发送短信时,短信平台会根据设置,在短信内容里附加个性签名,再发送给指定手机号码。
短信模板:阿里云肯定不会允许你随意发送短信,因此会要求你提前定义好短信发送的内容。当然,内容中允许出现一些参数变量,但基本内容是固定的,这样的一套定义好的短信内容,就是短信模板。
短信服务如何实现?
传统方式
缺点:代码耦合、代码冗余、代码维护麻烦
如何解决?
方法一:基于消息队列改为异步调用
方法二:- 抽取自定义启动器(starter)
本篇主要讲述方法二的使用
自定义短信服务starter实现
开发步骤:
自定义启动器:
- 创建工程:aliyun_springboot_starter 自定义启动器(集成阿里云服务)
- 在pom.xml导入阿里云相关坐标信息 lombok等
- 提供属性类(SmsProperties)读取配置文件中相关阿里云SMS短信服务相关参数
- 抽取工具类(SmsTemplate)抽取给指定用户发送短信方法-参考阿里云官方文档
- 新建自动配置类(SmsAutoConfiguration)注册模板对象(将模板对象加入到IOC容器中)
- 在resources目录下新建META-INF文件夹 文件夹下创建文件spring.factories文件-将来springboot会扫描每个jar包中包含该文件
使用步骤:
- 在pom.xml中引入自定义starter的依赖
- 在application.yml中增加阿里云短信服务需要账号信息
- 直接注入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安装到本地仓库
测试即可