接口

package cn.daenx.framework.notify.sms.service;

import cn.daenx.framework.common.vo.system.utils.SmsSendResult;

import java.util.Map;

/**
* 短信接口
*/
public interface SmsService {
SmsSendResult sendSms(Map<String, String> info, String phones, String templateId, Map<String, String> param);
}

阿里云实现

package cn.daenx.framework.notify.sms.service.impl;

import cn.daenx.framework.common.vo.system.utils.SmsSendResult;
import cn.daenx.framework.notify.sms.service.SmsService;
import com.alibaba.fastjson2.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.stereotype.Service; import java.util.Map; @Service("aliyun")
public class AliyunSmsService implements SmsService {
/**
* 发送短信协议,阿里云
*
* @param info
* @param phones 多个手机号用,隔开
* @param templateId
* @param param 例如模板为:您的验证码为:${code},请勿泄露于他人!那么key=code,value=1234
* @return
*/
@Override
public SmsSendResult sendSms(Map<String, String> info, String phones, String templateId, Map<String, String> param) {
try {
Config config = new Config();
config.setAccessKeyId(info.get("accessKeyId"));
config.setAccessKeySecret(info.get("accessKeySecret"));
config.setEndpoint(info.get("endpoint"));
Client client = new Client(config);
com.aliyun.dysmsapi20170525.models.SendSmsRequest req = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phones)
.setSignName(info.get("signName"))
.setTemplateCode(templateId)
.setTemplateParam(JSON.toJSONString(param));
SendSmsResponse resp = client.sendSms(req);
SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess("OK".equals(resp.getBody().getCode())).msg(resp.getBody().getMessage()).aliyunRes(resp).build();
return smsSendResult;
} catch (Exception e) {
e.printStackTrace();
SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(false).msg(e.getMessage()).build();
return smsSendResult;
}
}
}

腾讯云实现

package cn.daenx.framework.notify.sms.service.impl;

import cn.daenx.framework.common.vo.system.utils.SmsSendResult;
import cn.daenx.framework.notify.sms.service.SmsService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import org.springframework.stereotype.Service; import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; @Service("tencent")
public class TencentSmsService implements SmsService {
/**
* 发送短信协议,腾讯云
*
* @param info
* @param phones 多个手机号用,隔开,需要加+86等前缀
* @param templateId
* @param param 例如模板为:例如模板为:验证码为:{1},有效期为{2}分钟,如非本人操作,请忽略本短信。那么key=1,value=6666,key=2,value=5
* @return
*/
@Override
public SmsSendResult sendSms(Map<String, String> info, String phones, String templateId, Map<String, String> param) {
try {
Credential credential = new Credential(info.get("accessKeyId"), info.get("accessKeySecret"));
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint(info.get("endpoint"));
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SmsClient client = new SmsClient(credential, "", clientProfile);
com.tencentcloudapi.sms.v20190711.models.SendSmsRequest req = new SendSmsRequest();
Set<String> set = Arrays.stream(phones.split(",")).collect(Collectors.toSet());
req.setPhoneNumberSet(ArrayUtil.toArray(set, String.class));
if (CollUtil.isNotEmpty(param)) {
req.setTemplateParamSet(ArrayUtil.toArray(param.values(), String.class));
}
req.setTemplateID(templateId);
req.setSign(info.get("signName"));
req.setSmsSdkAppid(info.get("sdkAppId"));
com.tencentcloudapi.sms.v20190711.models.SendSmsResponse resp = client.SendSms(req);
SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(true).msg("ok").tencentRes(resp).build();
for (SendStatus sendStatus : resp.getSendStatusSet()) {
if (!"Ok".equals(sendStatus.getCode())) {
smsSendResult.setSuccess(false);
sendStatus.setMessage(sendStatus.getMessage());
break;
}
}
return smsSendResult;
} catch (Exception e) {
e.printStackTrace();
SmsSendResult smsSendResult = SmsSendResult.builder().isSuccess(false).msg(e.getMessage()).build();
return smsSendResult;
}
}
}

调用

//type就是实现类方法上的@Service注解的参数
//String type = "tencent";
String type = "aliyun";
//SpringUtil是hutool里的工具类
SmsService smsService = SpringUtil.getApplicationContext().getBean(type, SmsService.class);
SmsSendResult smsSendResult = smsService.sendSms(xxx, xxx, xxx, xxx);

java实现一个接口多个实现类,并且调用指定实现方法@Service的更多相关文章

  1. net core天马行空系列: 一个接口多个实现类,利用mixin技术通过自定义服务名,实现精准属性注入

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 哈哈哈哈,大家好,我 ...

  2. DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口

     SRE vs DevOps:是敌是友? - DockOne.io http://www.dockone.io/article/5935   RE vs DevOps:是敌是友? [编者的话]网站可靠 ...

  3. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  4. java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈”per_page”是一个json对象,我们可以根据”per_page”来找到对应值是3,而第二个红圈“data”是一个JSON数组,而不是对象,不能 ...

  5. Java -- 获取指定接口的所有实现类或获取指定类的所有继承类

    Class : ClassUtil package pri.lime.main; import java.io.File; import java.io.IOException; import jav ...

  6. 如何得到一个接口所有的实现类(及子接口)?例如:Eclipse IDE

    (一)Eclipse IDE的做法 它会解析所有的Java文件.Class文件. 技巧:在Eclipse中,选中Interface,按下F4,就可以查看到所有的实现类及子接口. 例如: (二)自己怎么 ...

  7. java new一个接口到底要做什么

    转自:http://www.cnblogs.com/yjmyzz/p/3448330.html java中的匿名类有一个倍儿神奇的用法,见下面代码示例: 1 package contract; 2 3 ...

  8. SSM(Spring)中,在工具类中调用服务层的方法

    因为平时在调用service层时都是在controller中,有配置扫描注入,spring会根据配置自动注入所依赖的服务层. 但因我们写的工具类不属于controller层,所以当所写接口需要调用服务 ...

  9. 一个接口多个实现类的Spring注入方式

    1. 首先, Interface1 接口有两个实现类 Interface1Impl1 和 Interface1Impl2 Interface1 接口: package com.example.serv ...

  10. Effective Java:Ch4_Class:Item14_在public类中应该使用访问方法而不是public域

    你可能偶尔需要编写退化类,目的只是为了集中实例域: // Degenerate classes like this should not be public! class Point { public ...

随机推荐

  1. 【 Python 】补全fibersim 导出的xml语法

    fibersim导出的xml文件中,node 和mesh部分的标签会缺失.即<R></R>变成了<R/>. 以下python脚本可以自动修正 # ********* ...

  2. 大模型评测之幻觉检测hallucination_evaluation_model

    大背景: 2025开年deepseek铺天盖地的新闻 参会代表已经表明,年度主线就是以AI为基础 Manus于3月初横空出世 国内各种模型竞赛的现状,只要是和科技沾边的公司不可能没有大模型,哪怕是里三 ...

  3. 【高德地图】离线地图jsapi2.0 插件引用

    当引用一个插件,但是这个插件没有时会报错: Uncaught TypeError: AMap.ControlBar is not a constructor 这里引用了罗盘这个插件 这时候需要翻看高德 ...

  4. 使用PIO自定义每一个格子的属性和值,完全DIY--Excel,不整齐也可以实现

    常规表格样式的Excel导出, 有一种不是常规表格样式的Excel导出, 比如如下这种怎么办 快速的excel框架API肯定不支持这种 所以我们需要自定义格子的内容 private CellStyle ...

  5. 万字长文详解SIFT特征提取

    本文对 SIFT 算法进行了详细梳理.SIFT即尺度不变特征变换(Scale-Invariant Feature Transform),是一种用于检测和描述图像局部特征的算法.该算法对图像的尺度和旋转 ...

  6. 团队小规模本地大模型服务平台搭建 - Windows

    实现目标和考虑因素 部署一个支持多用户同时使用.多模型运行的离线局域网大模型服务器 需要考虑以下几个关键因素: 大模型的加载和管理.使用一个基础大模型,根据需要创建多个专用模型,模型管理方便可靠. 并 ...

  7. Redis 高可用方案

    本文分享自天翼云开发者社区<Redis 高可用方案>,作者:芋泥麻薯 一.常见使用方式 Redis的几种常见使用方式包括: Redis单副本: • Redis多副本(主从): • Redi ...

  8. BUUCTF---异性相吸(欠编码)

    1.题目 ܟࠄቕ̐员䭜塊噓䑒̈́ɘ䘆呇Ֆ䝗䐒嵊ᐛ asadsasdasdasdasdasdasdasdasdasdqwesqf 2.知识 3.解题 很奇怪,不知道什么加密,借鉴网上参考,得知需将其转化为 ...

  9. 【服务器】npm配置国内镜像源

    [服务器]npm配置国内镜像源 零.问题 配置Node.js的HTTPS的时候,下载不了 一.解决 这里使用的是淘宝的镜像: npm config set registry https://regis ...

  10. PII is hidden.

    使用 Microsoft.AspNetCore.Authentication.JwtBearer 做验证的时候报错如下: IDX10503: Signature validation failed. ...