console.log|

will-yang

园龄:3年3个月粉丝:2关注:1

2022-02-13 23:34阅读: 121评论: 0推荐: 0

SpringBoot-多配置项处理

背景简介

因为博猪最近在开发一个sass平台,牵扯到一些常用的第三方的对接,自己也实现了一些第三方的对接,但是由于业务的需要,系统平台可能不太满足同一种类型的第三方,所以特此记录一下。

本文以常用的短信平台来举例,只是涉及设计思维,并不进行代码实现,相关第三方实现请参考第三方的API文档或者相关资料。

项目假设:系统需同时满足三个短信运营商的使用。

项目准备

项目依赖

父项目

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.4.4</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

相关依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

运营商枚举

public enum SmsISPEnum {

    TENCENT("Tencent", "腾讯云短信"),
    GENLAN("GenLan", "创蓝253"),
    ZYYX("Zyyx", "卓越云想");

    private String code;
    private String  name;

    SmsISPEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }
}

定义短信接口

定义统一短信接口,任何短信相关的都必须实现该接口!!

该接口存在的目的:定义一套基本的短信接口行为,第三方特性功能由接口实现类进行拓展。

/**
 * @ClassName SmsManager
 * @Description
 * @Author will
 * @Date 2021/10/6 20:45
 */
public interface SmsManager {
    /**
     * 异步发送短信
     * @param phone 手机号
     * @param content 短信内容
     */
    public void asyncSendSms(String phone, String content);

    /**
     * 发送短信
     * @param phone 手机号
     * @param content 短信内容
     */
    public void sendSms(String phone, String content);

}

腾讯短信

/**
 * @ClassName TencentSmsManagerImpl
 * @Description  腾讯短信
 * @Author will
 * @Date 2021/10/6 20:50
 */
@Service
public class TencentSmsManagerImpl implements SmsManager {
    @Override
    public void asyncSendSms(String phone, String content) {
        //发送短信实现
        System.out.println("TencentSmsManagerImpl.asyncSendSms");
    }

    @Override
    public void sendSms(String phone, String content) {
        //发送短信实现
        System.out.println("TencentSmsManagerImpl.sendSms");
    }
}

253创蓝短信

/**
 * @ClassName GenLanSmsManagerImpl
 * @Description   253创蓝短信
 * @Author will
 * @Date 2021/10/6 20:52
 */
@Service
public class GenLanSmsManagerImpl implements SmsManager {
    @Override
    public void asyncSendSms(String phone, String content) {
        //发送短信实现
        System.out.println("GenLanSmsManagerImpl.asyncSendSms");
    }

    @Override
    public void sendSms(String phone, String content) {
        //发送短信实现
        System.out.println("GenLanSmsManagerImpl.asyncSendSms");
    }
}

卓越云想

/**
 * @ClassName ZyyxSmsManagerImpl
 * @Description  卓越云想
 * @Author will
 * @Date 2021/10/6 20:52
 */
@Service
public class ZyyxSmsManagerImpl implements SmsManager {
    @Override
    public void asyncSendSms(String phone, String content) {
        //发送短信实现
        System.out.println("ZyyxSmsManagerImpl.asyncSendSms");
    }

    @Override
    public void sendSms(String phone, String content) {
        //发送短信实现
        System.out.println("ZyyxSmsManagerImpl.asyncSendSms");

    }
}

初步实现-单一版

前期博猪只能使用进行使用单一的运营商,当然前期只有两家运营商,但实际使用的只有一家运营商,具体代码实现如下:

@SpringBootApplication
public class MessageEngineApplication {
    @Bean
    public SmsManager smsManager() {
        SmsManager smsManager = new TencentSmsManagerImpl();
        return smsManager;
    }
    public static void main(String[] args) {
        SpringApplication.run(MessageEngineApplication.class, args);
    }
}

以上代码其实很好理解,其实就是在项目启动时,手动创建一个指定的实例,注入进去,但是这种方式的弊端也就出现了:由于腾讯云短信或者阿里大于(阿里云短信)等是面向大众或者面向大多数用户的,所以他们的短信比较适用于模板化,所以非模板话的话是不能实现的,下面举个栗子:

  • 发送短信验证码
  • 取件码
  • 相关通知

通过上面我们发现,针对需求量大,且要求稳定的时候,我们使用以上平台的运营商是可以的,但是针对一下场景那就只能一个模板定义一套了:

  • 针对某些快捷操作,比如下载电子订单等,发送还有短连接的短信
  • 针对某些模板我们可以共用一套,然后通过我们一些工具或者配置实现我们短信模板的复用

。。。。虽然针对以上场景大多数是运营商各种不兼容导致的,但是业务场景也是摆在这里,所以我们还是需要进行去实现的,我看了一下我们大拿写的Redis根据模板发送站内信的代码实现,照葫芦画瓢,实现了一个简易版的兼容多配置的短信发送。

最终实现-我全都要

定义启动配置类

/**
 * @ClassName SmsConfiguration
 * @Description
 * @Author will
 * @Date 2021/10/6 20:44
 */
@Configuration
public class SmsConfiguration {

    private static Map<String, SmsManager> smsManagerMap = new HashMap<>(3);

    public static SmsManager getSmsManager(String ispType) {
        return smsManagerMap.get(ispType);
    }

    @PostConstruct
    public void initServices() {
        smsManagerMap.put(SmsISPEnum.TENCENT.getCode(), new TencentSmsManagerImpl());
        smsManagerMap.put(SmsISPEnum.GENLAN.getCode(), new GenLanSmsManagerImpl());
        smsManagerMap.put(SmsISPEnum.ZYYX.getCode(), new ZyyxSmsManagerImpl());
    }
}

调用方式案例

具体相关配置我全部搞到数据库中了,这里为了记录核心思想,暂时写死!!!

/**
 * @ClassName SmsBootStrap
 * @Description
 * @Author will
 * @Date 2021/10/6 20:54
 */
public class SmsBootStrap {
    public static void main(String[] args) {

        ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(SmsConfiguration.class);

        SmsManager smsManager = SmsConfiguration.getSmsManager(SmsISPEnum.TENCENT.getCode());
        smsManager.sendSms(null, null);

    }
}

总结

通过上方案例其实不难发现,只是运用了SpringBoot启动加载时配置优先级的问题,@Configuration配置类会在所有实例注入后,在进行实现,所以他的优先级是最低的。

本文作者:will-yang

本文链接:https://www.cnblogs.com/letcoding/p/15890895.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   will-yang  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作曲 : Reol

作词 : Reol

fade away...do over again...

fade away...do over again...

歌い始めの一文字目 いつも迷ってる

歌い始めの一文字目 いつも迷ってる

どうせとりとめのないことだけど

伝わらなきゃもっと意味がない

どうしたってこんなに複雑なのに

どうしたってこんなに複雑なのに

噛み砕いてやらなきゃ伝わらない

ほら結局歌詞なんかどうだっていい

僕の音楽なんかこの世になくたっていいんだよ

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.

目の前 広がる現実世界がまた歪んだ

目の前 広がる現実世界がまた歪んだ

何度リセットしても

僕は僕以外の誰かには生まれ変われない

「そんなの知ってるよ」

気になるあの子の噂話も

シニカル標的は次の速報

麻痺しちゃってるこっからエスケープ

麻痺しちゃってるこっからエスケープ

遠く遠くまで行けるよ

安定なんてない 不安定な世界

安定なんてない 不安定な世界

安定なんてない きっと明日には忘れるよ

fade away...do over again...

fade away...do over again...

そうだ世界はどこかがいつも嘘くさい

そうだ世界はどこかがいつも嘘くさい

綺麗事だけじゃ大事な人たちすら守れない

くだらない 僕らみんなどこか狂ってるみたい

本当のことなんか全部神様も知らない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.