Spring-Smart-DI は実装クラスを動的に切り替えます。非常に優れています。

Spring-Smart-DI は実装クラスを動的に切り替えます。非常に優れています。

実際のシステム開発のシナリオでは、同じ機能を複数のサービスプロバイダーに接続する必要があるというタイプの要件に頻繁に遭遇します。これを行うには 2 つの重要な理由があります。第一に、サービスプロバイダーのサービスが利用できなくなるリスクを回避し、問題が発生した場合に他のサービスプロバイダーに迅速に切り替えて、システムの安定性とビジネスの継続性を確保できるようにするためです。第二に、サービスプロバイダーごとに課金基準が異なります。コスト管理の観点から、実際の状況に基づいて柔軟に切り替える必要があります。

高速スイッチング ロジックを実装する従来の方法は、まず各サービス プロバイダーに対応する実装クラスを記述し、次に構成ポイント (この構成ポイントはデータベースまたは Nacos のような構成センター) で現在使用されているサービス プロバイダーを構成することです。関連するビジネス ロジックが実行されるたびに、現在使用されているサービス プロバイダーの情報を構成ポイントから取得し、サービス プロバイダーに対応するビジネス ロジックを実行する必要があります。

複数の SMS サービス プロバイダーへのシステム アクセスを例にとると、ユーザーは自分のニーズに応じて異なるサービス プロバイダー間を動的に切り替えることができます。この機能を手動で実装するための具体的な手順を詳しく見てみましょう。

最初のステップは、特定の構成場所 (Nacos やデータベースなど) で、現在使用されているサービス プロバイダーに対応する識別値を構成することです。たとえば、 sms.impl = "某腾短信"を設定します

2 番目のステップは、コード内で SMS 操作を実行するときに、 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-diAutowiredProxySPIは、この問題を解決するために慎重に設計されています。

1. spring-smart-di の紹介

spring-smart-diは Spring @Autowiredアノテーションの革新的な拡張機能であり、ユーザーにAutowired注入ロジックをカスタマイズする機能を提供します現在、 @SmartAutowired@AutowiredProxySPIという 2 つの非常に重要なアノテーションを実装していますこの記事では、 AutowiredProxySPI使用してサービス プロバイダーを動的に切り替える機能を実装する方法に焦点を当てます

システムが複数の SMS サービス プロバイダーに接続されていると仮定して、 AutowiredProxySPI使用して動的な切り替えを実現する方法を詳しく学習するためのクイック スタート ケースを見てみましょう

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-smart-diの強力な機能を有効にするには、 Spring 構成クラスに@EnableSmartDIアノテーションをマークします

2.3 @EnvironmentProxySPIアノテーションの使用

@EnvironmentProxySPIアノテーションは構成ポイントを表します。その主な機能は、特定の実装クラスを取得する方法のロジックを構成することです。

システム内に 2 つの SMS サービス プロバイダーがあり、動的な切り替えが必要であるとします。環境変数構成ポイントから現在使用されているサービス プロバイダーを取得するには、インターフェイスに@EnvironmentProxySPIアノテーションを構成する必要があります。ここでは、構成情報をプロパティ${sms.impl}に保存します

 @EnvironmentProxySPI("${sms.impl}") publicinterface SmsService { } // 给实现类定义别名@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;

上記の手順により、サービス プロバイダーを動的に切り替えるという要件が正常に完了しました。構成プロパティ${sms.impl}の値を変更すると、サービスを再起動せずにシステムがリアルタイムで有効になります。これは、 @AutowiredProxySPIがプロキシ オブジェクトを挿入するためです。実行されるたびに、まず現在使用されている実装クラスをリアルタイムで取得し、呼び出し操作を実行します。また、 @Autowiredアノテーションを直接使用する場合と基本的に使用方法に違いはありません

2.6 さまざまな構成ポイントの定義

@EnvironmentProxySPIアノテーションは主に、環境変数に関連する構成ポイントを構成するために使用されます。データベースから構成情報を取得するなど、構成をカスタマイズする場合は、独自のProxySPIアノテーションを実装できます。

以下は、カスタムDBProxySPIアノテーションの例です@ProxySPIアノテーションでマークし、特定の構成取得ロジック実装クラス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) { // 根据注解从数据库获取要注入的实现类String configName = sysConfigDao.getConfig(spi.value()); return springContext.getBean(configName); } } @DBProxySPI("${sms.impl}") publicinterface SmsService { }

上記の手順により、サービスプロバイダーを動的に切り替える機能を柔軟に実装し、さまざまなニーズに応じて構成取得ロジックをカスタマイズできます。 spring-smart-diこの動的な切り替えシナリオを処理するための簡潔で効率的な方法を提供し、コードの柔軟性を高め、保守を容易にします。

<<:  先ほど、Manus Lianchuang は「サンドボックス脱獄」の問題に反応し、次のように述べました。「MCP は役に立たない!」さて、オープンソース化計画が正式に発表されました!

ブログ    

推薦する

金融AIの実装は難しいですか?ガートナー: AI のユースケースを 3 倍にするには 4 つのステップが必要

金融分野で AI を適切に導入するには、単に時間や資金を最も多く投資すればよいという問題ではありませ...

人工知能は、電力網とユビキタス電力のIoTの構築と開発にとって重要な方向性となるだろう

[[285204]]現在、モバイルインターネット、ビッグデータ、スーパーコンピューティングなどの新し...

人工知能が地震監視を新たな時代へ導く

[[388691]]被害の程度を軽減することは地震研究者にとって重要な目標です。破壊的な地震が発生し...

人工知能は祝福か、それとも呪いなのか?事故は急増しており、アップルとグーグルも例外ではない

人工知能は現代の大きな発展のトレンドであり、世界中のほぼすべてのハイテク企業が AI 分野の技術を研...

スマートサーマルイメージングカメラは屋外セキュリティソリューションの第一選択肢となる

スマートサーマルイメージングカメラは、屋外の資産を保護するための侵入者検知ソリューションとして急速に...

自動運転のベテラン、UberのためにGoogleの機密文書14,000件を盗んだとして訴えられる

[[275279]]アンソニー・レヴァンドウスキーはシリコンバレーのスターエンジニアです。自動運転技...

...

大規模モデルのスコアリングのためのベンチマークは信頼できるでしょうか? Anthropicは大きなレビューを出した

現段階では、人工知能 (AI) が社会に与える影響に関する議論のほとんどは、信頼性、公平性、悪用され...

Google AIのスターがPika: ビデオ生成Lumiereの創設科学者に就任

動画世代が猛スピードで進化する中、ピカは偉大なる将軍を迎える―― Google の研究者である Om...

【2021年開始】人工知能産業の発展は依然として多くの課題に直面している

[[380335]]新華網、北京、2月3日(記者:孫雲龍)新たなインフラの重要な部分として、人工知能...

ディープラーニング + OpenCV、Python でリアルタイムのビデオ オブジェクト検出を実現

OpenCV と Python を使用してライブ ビデオ ストリームでディープラーニング オブジェク...

生死に関わる問題:病院のICU病棟で人工知能は何ができるのか?

病院の集中治療室 (ICU) では、重病の患者を一日中一連の機器に接続し、いつでもバイタルサインを監...

PaddlePaddle 中国ツアー - スマート製造業を支援するゼロ閾値 AI 革新的アプリケーション

製造業は急速にインテリジェント化の新たな段階に入りつつあり、ますます多くの製造企業が「インテリジェン...

...

顔認識はどのようにして顔を認識するのでしょうか?

顔をスキャンして出勤記録を取ったり、顔で支払いをしたり、顔でドアを開けたり、顔をスキャンしながら生活...