스프링 플러그인을 사용하여 전략 패턴을 구현하는 방법에 대해 이야기하십시오.

머리말

우연히 봄에 spring-plugin이 있다는 것을 알게 되었는데, 공식 홈페이지에서는 다음과 같이 소개하고 있습니다.

Spring Plugin은 핵심 시스템의 기능을 확장하는 플러그인 구현을 갖는 핵심 유연성을 제공하지만 물론 동적 클래스 로딩 또는 런타임 설치 및 플러그인 배포와 같은 핵심 OSGi 기능을 제공하지 않는 핵심 유연성을 제공함으로써 플러그인 개발에 보다 실용적인 접근 방식을 제공합니다. 따라서 Spring Plugin은 OSGi만큼 강력하지는 않지만 확장 가능한 모듈식 애플리케이션을 구축하기 위한 가난한 사람의 요구 사항을 충족합니다.

일반적인 아이디어는 Spring 플러그인이 플러그인 개발에 보다 실용적인 접근 방식을 제공한다는 것입니다. 이는 핵심 시스템 기능을 확장하기 위해 플러그인 구현의 핵심 유연성을 제공하지만 물론 동적 클래스 로딩 또는 런타임 설치 및 배포와 같은 핵심 OSGi 기능은 제공하지 않습니다. 플러그인. 따라서 Spring 플러그인은 OSGi만큼 강력하지는 않지만 확장 가능한 모듈식 애플리케이션을 구축하려는 가난한 사람의 요구를 충족합니다.

이 글은 스프링 플러그인을 사용하여 전략 패턴을 구현하는 방법에 대해 설명합니다.

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();
    }
}

참고: 특정 플러그인은 스프링 빈이어야 합니다.

6. 플러그인 사용

비즈니스 프로젝트에 주입

@Autowired
private 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을 기반으로 확장할 때 특정 Plug-in 구현 클래스는 반드시 Spring Bean이어야 하며, 그렇지 않으면 Plug-in을 찾을 수 없음을 유의해야 한다.

더 자세한 예시는 공식 홈페이지에서 확인하실 수 있습니다.

https://github.com/spring-projects/spring-plugin

데모 링크

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-springplugin-strategy

추천

출처blog.csdn.net/kingwinstar/article/details/129037834