0、背景
一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用快速切换或者收费不同需要切换,那我们一般做快速切换逻辑传统无非就是先将每个服务商实现,然后在配置点(数据库或者nacos)配置当前正在使用的服务商。然后每次执行的时候从配置点获取当前正在使用的服务商,然后去执行该服务商的业务逻辑。
比如系统接入了多个短信服务商,然后用户可以动态的切换不同的服务商,
如果让我们手写会如何实现。
-
第一步先在某个位置(不管是nacos还是数据库)配置当前使用的服务商的对应值比如
sms.impl = "某腾短信"
-
第二步,在代码里执行发短信的时候,手动获取该
sms.impl
对应的服务商的实现类,伪代码可能如下
void sendSmsTouser(Req req){
// 1、获取当前使用的服务商
String name = get("sms.impl");
// 2、获取对应的实现类
SmsService smsService = springContext.getBean(name);
// 3、使用smsService执行具体业务逻辑
smsService.sendMsg(req)
}
这时有一个想法就是 spring的@Autowired注解
在注入的时候可以自动根据在配置点配置的实现类去注入,并且当配置变了,注入的实现类也会改变,这样就跟正常写代码一样不再需要去关注当前使用的实现类。这时spring-smart-di 的 AutowiredProxySPI
应运而生。
1、spring-smart-di
它是一个对spring@Autowired注解的扩展,能够自定义用户自己的Autowired注入逻辑,目前实现了两个功能分别是 @SmartAutowired
和 @AutowiredProxySPI
注解,我们这里要使用的便是AutowiredProxySPI 去实现我们的动态切换逻辑。
假设对接了多个短信服务商,下面以一个快速开始案例去看看如何使用 AutowiredProxySPI
如何