Skip to content

基于 Spring-Plugin 插件化开发

Spring Plugin 是一个允许你为 Spring 应用程序定义插件接口并在运行时动态加载插件实现的库。仓库地址(https://github.com/spring-projects/spring-plugin) 以下介绍集成步骤

添加 maven 依赖

xml
        <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

定义 PayServicePlugin 继承 Plugin 接口

java
public interface PayServicePlugin extends Plugin<PayContext> {

    void pay();
}

PayContext 上下文

java
@Data
public class PayContext{

    private String name;

    private long price;
}

实现 PayServicePlugin 接口

java
@Component
public class AlipayServicePlugin implements PayServicePlugin {
    @Override
    public void pay() {
        System.out.println("阿里支付");
    }

    @Override
    public boolean supports(PayContext context) {
        return context.getName().equals("ali");
    }

}


@Component
public class WxpayServicePlugin implements PayServicePlugin {
    @Override
    public void pay() {
        System.out.println("微信支付");
    }

    @Override
    public boolean supports(PayContext context) {
        return context.getName().equals("wx");
    }

}

supports 方法是 Plugin 接口提供的,用于寻找执行类

测试

java
    @Autowired
    private PluginRegistry<PayServicePlugin,PayContext> pluginRegistry;

    @Test
    public void test() {
        PayContext payContext = new PayContext();
        payContext.setPrice(10l);
        payContext.setName("ali");
        Optional<PayServicePlugin> plugin = pluginRegistry.getPluginFor(payContext);
        plugin.orElseThrow(() -> new IllegalArgumentException("Not Support Pay Type"))
                .pay();
    }

可以看到传入不同的 name 就可以动态切换支付方式

Released under the MIT License.