欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的步驟

 更新時(shí)間:2025年03月21日 09:37:46   作者:Bugkillers  
文章介紹了如何使用spring-smart-di的@AutowiredProxySPI注解來(lái)實(shí)現(xiàn)動(dòng)態(tài)切換服務(wù)提供商的功能,通過(guò)配置點(diǎn)和代理對(duì)象,實(shí)現(xiàn)動(dòng)態(tài)切換而無(wú)需重啟服務(wù),感興趣的朋友一起看看吧

前言: 在系統(tǒng)開(kāi)發(fā)的實(shí)際場(chǎng)景中,我們常常會(huì)碰到這樣一類需求:同一個(gè)功能需要對(duì)接多個(gè)服務(wù)提供商。這么做主要基于兩個(gè)重要原因。
其一,為了規(guī)避某個(gè)服務(wù)商的服務(wù)出現(xiàn)不可用的風(fēng)險(xiǎn),以便在出現(xiàn)問(wèn)題時(shí)能夠迅速切換到其他服務(wù)商,確保系統(tǒng)的穩(wěn)定性和業(yè)務(wù)的連續(xù)性;
其二,不同服務(wù)商的收費(fèi)標(biāo)準(zhǔn)存在差異,從成本控制的角度出發(fā),需要根據(jù)實(shí)際情況進(jìn)行靈活切換。

傳統(tǒng)的快速切換邏輯實(shí)現(xiàn)方法是,先為每個(gè)服務(wù)商編寫(xiě)對(duì)應(yīng)的實(shí)現(xiàn)類,然后在配置點(diǎn)(這個(gè)配置點(diǎn)可以是數(shù)據(jù)庫(kù),也可以是像 Nacos 這樣的配置中心)配置當(dāng)前正在使用的服務(wù)商。在每次執(zhí)行相關(guān)業(yè)務(wù)邏輯時(shí),都要從配置點(diǎn)獲取當(dāng)前使用的服務(wù)商信息,再去執(zhí)行該服務(wù)商對(duì)應(yīng)的業(yè)務(wù)邏輯。

以系統(tǒng)接入多個(gè)短信服務(wù)商為例,用戶可以根據(jù)自身需求動(dòng)態(tài)地在不同服務(wù)商之間進(jìn)行切換。下面我們?cè)敿?xì)看看如果手動(dòng)實(shí)現(xiàn)這個(gè)功能,具體步驟是怎樣的。

第一步,在某個(gè)配置位置(例如 Nacos 或者數(shù)據(jù)庫(kù))配置當(dāng)前使用的服務(wù)商對(duì)應(yīng)的標(biāo)識(shí)值。比如,我們?cè)O(shè)置 sms.impl = “某騰短信”。

第二步,在代碼中執(zhí)行發(fā)短信操作時(shí),手動(dòng)獲取 sms.impl 對(duì)應(yīng)的服務(wù)商實(shí)現(xiàn)類。以下是相應(yīng)的偽代碼示例:

void sendSmsTouser(Req req) {
    // 1、獲取當(dāng)前使用的服務(wù)商
    String name = get("sms.impl");
    // 2、獲取對(duì)應(yīng)的實(shí)現(xiàn)類
    SmsService smsService = springContext.getBean(name);
    // 3、使用 smsService 執(zhí)行具體業(yè)務(wù)邏輯
    smsService.sendMsg(req);
}

不過(guò),這種實(shí)現(xiàn)方式存在明顯的弊端,它比較繁瑣,每次執(zhí)行都需要手動(dòng)去獲取配置并加載對(duì)應(yīng)的實(shí)現(xiàn)類。那么,有沒(méi)有一種更優(yōu)雅的方式,讓 Spring 的 @Autowired注解在注入時(shí)能夠自動(dòng)根據(jù)配置點(diǎn)的配置去注入對(duì)應(yīng)的實(shí)現(xiàn)類,并且當(dāng)配置發(fā)生變化時(shí),注入的實(shí)現(xiàn)類也能自動(dòng)更新呢?spring-smart-di 的@AutowiredProxySPI 就是為解決這個(gè)問(wèn)題而精心設(shè)計(jì)的。

1. spring-smart-di 簡(jiǎn)介

--------------------------------------------------------------------------------------

spring-smart-di 是對(duì) Spring@Autowired 注解的一次創(chuàng)新性擴(kuò)展,它為用戶提供了自定義 Autowired 注入邏輯的能力。目前,它實(shí)現(xiàn)了兩個(gè)非常重要的注解:@SmartAutowired 和@AutowiredProxySPI 。在本文中,我們將重點(diǎn)聚焦于如何使用AutowiredProxySPI 來(lái)實(shí)現(xiàn)動(dòng)態(tài)切換服務(wù)提供商的功能。

假設(shè)我們的系統(tǒng)對(duì)接了多個(gè)短信服務(wù)商,下面我們通過(guò)一個(gè)快速上手的案例,詳細(xì)了解如何使用 AutowiredProxySPI來(lái)實(shí)現(xiàn)動(dòng)態(tài)切換。

2、快速開(kāi)始

2.1 引入依賴

首先,我們需要在項(xiàng)目中引入 spring-smart-di 的依賴。在 Maven 項(xiàng)目的 pom.xml 文件中添加以下依賴代碼:

<dependency>
    <groupId>io.github.burukeyou</groupId>
    <artifactId>spring-smart-di-all</artifactId>
    <version>0.2.0</version>
</dependency>

2.2 啟用功能

在 Spring 配置類上標(biāo)記 @EnableSmartDI 注解,以此來(lái)啟用 spring-smart-di 的強(qiáng)大功能。

2.3 @EnvironmentProxySPI 注解的使用

@EnvironmentProxySPl注解代表著一個(gè)配置點(diǎn),其主要作用是配置如何獲取具體實(shí)現(xiàn)類的邏輯。

假設(shè)我們的系統(tǒng)中有兩個(gè)短信服務(wù)商,需要實(shí)現(xiàn)動(dòng)態(tài)切換。我們需要在接口上配置 @EnvironmentProxySPl注解,表示從環(huán)境變量配置點(diǎn)中獲取當(dāng)前使用的服務(wù)商。這里我們將配置信息存儲(chǔ)在屬性${sms.impl} 中。

@EnvironmentProxySPI("${sms.impl}")
publicinterface SmsService {
}
// 給實(shí)現(xiàn)類定義別名
@BeanAliasName("某騰短信服務(wù)")
@Component
publicclass ASmsService implements SmsService {
}
@BeanAliasName("某移短信服務(wù)")
@Component
publicclass BSmsService implements SmsService {
}

2.4 配置當(dāng)前使用的服務(wù)商

我們可以在配置文件中配置當(dāng)前使用的服務(wù)商。配置的值可以是 @BeanAliasName注解指定的值,也可以是@Component 注解指定的值,還可以是具體的全路徑類名。

sms:
  impl: 某移短信服務(wù)

2.5 @AutowiredProxySPI 注入使用

接下來(lái),我們只需要像使用 @Autowired 注解一樣使用 @AutowiredProxySPI 注解即可。

// 依賴注入
@AutowiredProxySPI
private SmsService smsService;

通過(guò)以上步驟,我們就成功完成了動(dòng)態(tài)切換服務(wù)提供商的需求。只要我們改變配置屬性${sms.impl} 的值,系統(tǒng)就會(huì)實(shí)時(shí)生效,而無(wú)需重啟服務(wù)。這是因?yàn)锧AutowiredProxySPI 注入的是一個(gè)代理對(duì)象,每次執(zhí)行時(shí)會(huì)先實(shí)時(shí)獲取當(dāng)前使用的實(shí)現(xiàn)類,然后再執(zhí)行調(diào)用操作。并且,在使用上與直接使用 @Autowired 注解基本沒(méi)有區(qū)別。

2.6 定義不同的配置點(diǎn)

@EnvironmentProxySPI 注解主要用于配置環(huán)境變量相關(guān)的配置點(diǎn)。如果我們想要自定義配置,例如從數(shù)據(jù)庫(kù)中獲取配置信息,可以實(shí)現(xiàn)自己的 ProxySPI 注解。下面是一個(gè)自定義 DBProxySPI 注解的示例,我們需要標(biāo)記上 @ProxySPI 注解,并指定具體的配置獲取邏輯實(shí)現(xiàn)類 AnnotationProxyFactory 。

@Inherited
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ProxySPI(DbProxyFactory.class) // 指定配置獲取邏輯
public @interface DBProxySPI {
    String value();
}
@Component
publicclass DbProxyFactory implements AnnotationProxyFactory<DBProxySPI> {
    @Autowired
    private SysConfigMapper sysConfigDao;
    @Override
    public Object getProxy(Class<?> targetClass, DBProxySPI spi) {
        // 根據(jù)注解從數(shù)據(jù)庫(kù)獲取要注入的實(shí)現(xiàn)類
        String configName = sysConfigDao.getConfig(spi.value());
        return springContext.getBean(configName);
    }
}
@DBProxySPI("${sms.impl}")
publicinterface SmsService {
}

通過(guò)以上的步驟,我們就可以靈活地實(shí)現(xiàn)動(dòng)態(tài)切換服務(wù)提供商的功能,并且可以根據(jù)不同的需求自定義配置獲取邏輯。 spring-smart-di 為我們提供了一種簡(jiǎn)潔、高效的方式來(lái)處理這種動(dòng)態(tài)切換的場(chǎng)景,讓我們的代碼更加靈活和易于維護(hù)。

到此這篇關(guān)于Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的文章就介紹到這了,更多相關(guān)Spring-Smart-DI 動(dòng)態(tài)切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論