最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

第一步,在某個配置位置(例如 Nacos 或者數(shù)據(jù)庫)配置當前使用的服務商對應的標識值。比如,我們設置 sms.impl = “某騰短信”。

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

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

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

1. spring-smart-di 簡介

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

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

假設我們的系統(tǒng)對接了多個短信服務商,下面我們通過一個快速上手的案例,詳細了解如何使用 AutowiredProxySPI來實現(xiàn)動態(tài)切換。

2、快速開始

2.1 引入依賴

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

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

2.2 啟用功能

在 Spring 配置類上標記 @EnableSmartDI 注解,以此來啟用 spring-smart-di 的強大功能。

2.3 @EnvironmentProxySPI 注解的使用

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

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

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

2.4 配置當前使用的服務商

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

sms:
  impl: 某移短信服務

2.5 @AutowiredProxySPI 注入使用

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

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

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

2.6 定義不同的配置點

@EnvironmentProxySPI 注解主要用于配置環(huán)境變量相關的配置點。如果我們想要自定義配置,例如從數(shù)據(jù)庫中獲取配置信息,可以實現(xiàn)自己的 ProxySPI 注解。下面是一個自定義 DBProxySPI 注解的示例,我們需要標記上 @ProxySPI 注解,并指定具體的配置獲取邏輯實現(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ù)庫獲取要注入的實現(xiàn)類
        String configName = sysConfigDao.getConfig(spi.value());
        return springContext.getBean(configName);
    }
}
@DBProxySPI("${sms.impl}")
publicinterface SmsService {
}

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

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

相關文章

  • mybatis解析xml配置中${xxx}占位符的代碼邏輯

    mybatis解析xml配置中${xxx}占位符的代碼邏輯

    本文主要介紹了mybatis解析xml配置中${xxx}占位符的代碼邏輯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>
    2023-05-05
  • java項目如何引入其他jar包

    java項目如何引入其他jar包

    通常在lib文件夾中存放從外部引入的jar包,所以把JAR文件復制進去。 然后修改編譯腳本,不需要去編譯tool文件夾里面的java類,直接把jar包添加到classpath,下文將詳細介紹
    2021-10-10
  • Spring Boot應用關閉分析詳解

    Spring Boot應用關閉分析詳解

    本文挖掘了Spring Boot的關閉方式,并列舉了關閉方式,從原理、源碼的角度闡述了Spring Boot的關閉代碼及擴展點,感興趣的朋友一起看看吧
    2024-12-12
  • SpringBoot yml配置文件調(diào)用過程解析

    SpringBoot yml配置文件調(diào)用過程解析

    這篇文章主要介紹了SpringBoot yml配置文件調(diào)用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 在SpringBoot中配置日志級別和輸出格式的教程詳解

    在SpringBoot中配置日志級別和輸出格式的教程詳解

    在開發(fā)一個應用程序時,日志記錄是非常重要的一環(huán),SpringBoot提供了多種日志輸出方式和配置選項,本文將介紹如何在SpringBoot應用程序中配置日志級別和輸出格式,需要的朋友可以參考下
    2023-06-06
  • spring定時器@Scheduled異步調(diào)用方式

    spring定時器@Scheduled異步調(diào)用方式

    在Spring Boot中,@Schedule默認使用單線程執(zhí)行定時任務,多個定時器會按順序執(zhí)行,為實現(xiàn)異步執(zhí)行,可以通過自定義線程池或實現(xiàn)SchedulingConfigurer接口,使用自定義線程池可以保證多個定時器并發(fā)執(zhí)行
    2024-11-11
  • 在springboot中如何使用線程池

    在springboot中如何使用線程池

    在SpringBoot中,可以通過定義ThreadPoolTaskExecutor的Bean并使用@Autowired注入來使用線程池,具體步驟包括創(chuàng)建ThreadPoolTaskExecutor的Bean配置,本文給大家介紹springboot使用線程池的例子,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java+EasyExcel實現(xiàn)單個接口導出多個Excel的示例詳解

    Java+EasyExcel實現(xiàn)單個接口導出多個Excel的示例詳解

    在日常開發(fā)中,我們經(jīng)常會遇到?Excel?導出的需求,大多是單個接口導出單個?Excel?文件,今天就基于?Spring?Boot?+?EasyExcel分享一種簡單、通用、可直接落地的實現(xiàn)方案,全程附完整代碼,新手也能快速上手
    2026-04-04
  • SpringBoot項目整合Redis教程詳解

    SpringBoot項目整合Redis教程詳解

    這篇文章主要介紹了SpringBoot項目整合Redis教程詳解,Redis?是完全開源的,遵守?BSD?協(xié)議,是一個高性能的?key-value?數(shù)據(jù)庫。感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • spring Retryable注解實現(xiàn)重試詳解

    spring Retryable注解實現(xiàn)重試詳解

    這篇文章主要介紹了spring Retryable注解實現(xiàn)重試詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

游戏| 天台县| 正安县| 调兵山市| 多伦县| 峨眉山市| 沛县| 潼关县| 正定县| 临清市| 高雄县| 壶关县| 桦南县| 涿鹿县| 定州市| 景宁| 外汇| 嘉峪关市| 临朐县| 金溪县| 交口县| 鸡泽县| 正宁县| 龙陵县| 定西市| 济源市| 兴山县| 清河县| 区。| 卓尼县| 焦作市| 静乐县| 瑞丽市| 嘉善县| 安多县| 卢氏县| 深水埗区| 唐河县| 长白| 厦门市| 开平市|