序文
偶然、spring に spring-plugin があることを知り、公式サイトでは次のように紹介されていました。
Spring Plugin は、プラグイン実装によりコア システムの機能を拡張するというコアの柔軟性を提供することにより、プラグイン開発に対するより実用的なアプローチを提供しますが、もちろん、動的なクラス ロードやランタイム インストール、プラグインのデプロイなどのコア OSGi 機能は提供しません。したがって、Spring Plugin は OSGi ほど強力ではありませんが、モジュール式の拡張可能なアプリケーションを構築するという貧乏人の要件には応えます。
一般的な考え方は、Spring プラグインはプラグイン開発に対するより実用的なアプローチを提供し、コア システム機能を拡張するためのプラグイン実装の核となる柔軟性を提供しますが、もちろん、動的なクラス ロードやランタイム インストールとデプロイメントなどのコア OSGi 機能は提供しません。プラグイン。したがって、Spring プラグインは OSGi ほど強力ではありませんが、モジュール式のスケーラブルなアプリケーションを構築するという貧しい人のニーズを満たします。
この記事では、Spring プラグインを使用して戦略パターンを実装する方法について説明します。
spring-plugin プラグインを使用して戦略モードのステップを実装する
1.プロジェクトのpomにspring-pluginを導入する
<dependency>
<groupId>org.springframework.plugin</groupId>
<artifactId>spring-plugin-core</artifactId>
<version>2.0.0.RELEASE<version>
</dependency>
注: springboot 2.2 より前のバージョンにはデフォルトで spring-plugin-core が統合されているため、バージョン番号を指定する必要はありません。ただし、統合バージョン番号は比較的低く、一部のメソッドは上位バージョンと互換性がありません。
2. エンティティ クラスを定義します。このエンティティ クラスは、このエンティティ クラスの背後にあるプラグイン バインディング プラグイン タイプによって使用されます。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SmsRequest implements Serializable {
private Map<String,Object> metaDatas;
private String to;
private String message;
private SmsType smsType;
}
3. org.springframework.plugin.core.Plugin インターフェースを実装するプラグインを定義する
public interface SmsPlugin extends Plugin<SmsRequest> {
SmsResponse sendSms(SmsRequest smsRequest);
}
4. アクティベーションプラグインを設定する
@EnablePluginRegistries(SmsPlugin.class)
@Configuration
public class SmsPluginActiveConfig {
}
5. プラグインの特定の実装クラスを定義します。
@Component
public class AliyunSmsPlugin implements SmsPlugin {
@Override
public SmsResponse sendSms(SmsRequest smsRequest) {
System.out.println("来自阿里云短信:" + smsRequest);
return SmsResponse.builder()
.code("200").message("发送成功")
.success(true).result("阿里云短信的回执").build();
}
@Override
public boolean supports(SmsRequest smsRequest) {
return SmsType.ALIYUN == smsRequest.getSmsType();
}
}
注: 特定のプラグインは Spring Bean である必要があります
6. プラグインの使用
ビジネスプロジェクトに注入する
@Autowired
プライベート PluginRegistry<SmsPlugin,SmsRequest> pluginRegistry;
通常、特定のプラグインを取得するには、pluginRegistry.getPluginFor メソッドを呼び出します。
例:
@RequiredArgsConstructor
public class SmsService {
private final PluginRegistry<SmsPlugin,SmsRequest> pluginRegistry;
public SmsResponse sendSms(SmsRequest smsRequest){
Optional<SmsPlugin> smsPlugin = pluginRegistry.getPluginFor(smsRequest);
return smsPlugin.orElseThrow(() -> new SmsException("Sms plugin is not binder with type : 【" + smsRequest.getSmsType() + "】"))
.sendSms(smsRequest);
}
}
7. テスト
@Test
public void testAliyunSms(){
SmsRequest smsRequest = SmsRequest.builder()
.message("模拟使用阿里云短信发送")
.to("136000000001")
.smsType(SmsType.ALIYUN)
.build();
SmsResponse smsResponse = smsService.sendSms(smsRequest);
Assert.assertTrue(smsResponse.isSuccess());
System.out.println(smsResponse);
}
要約する
この記事では主に、SMS 送信のシミュレーションの例を通じて、spring-plugin を使用してストラテジー モードを実装する方法を説明します。spi に加えてスケーラビリティの要件がある場合は、spring-plugin の使用を検討することもできます。ただし、spring-plugin に基づいて拡張する場合、特定のプラグイン実装クラスは Spring Bean である必要があることに注意してください。そうしないと、プラグインが見つかりません。
より詳細な例は公式ウェブサイトで見つけることができます
https://github.com/spring-projects/spring-plugin
デモリンク
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-springplugin-strategy