SPI机制简介

一、什么是SPI机制

SPI是Service Provider Interface 的简称,即服务提供者接口的意思。SPI说白了就是一种扩展机制,我们在相应配置文件中定义好某个接口的实现类,然后再根据这个接口去这个配置文件中加载这个实例类并实例化。有了SPI机制,那么就为一些框架的灵活扩展提供了可能,而不必将框架的一些实现类写死在代码里面。

二、SPI机制的主要目的
  1. 为了解耦,将接口和具体实现分离开来;
  2. 提高框架的扩展性。以前写程序的时候,接口和实现都写在一起,调用方在使用的时候依赖接口来进行调用,无权选择使用具体的实现类。
三、SPI机制案例
  1. JDBC驱动加载案例:利用Java的SPI机制,我们可以根据不同的数据库厂商来引入不同的JDBC驱动包;
  2. SpringBoot的SPI机制:我们可以在spring.factories中加上我们自定义的自动配置类,事件监听器或初始化器等;
  3. Dubbo的SPI机制:Dubbo更是把SPI机制应用的淋漓尽致,Dubbo基本上自身的每个功能点都提供了扩展点,比如提供了集群扩展,路由扩展和负载均衡扩展等差不多接近30个扩展点。如果Dubbo的某个内置实现不符合我们的需求,那么我们只要利用其SPI机制将我们的实现替换掉Dubbo的实现即可。
    上面的三个栗子先让我们直观感受下某些框架利用SPI机制是如何做到灵活扩展的。
四、如何使用Java的SPI

我们先来看看如何使用Java自带的SPI。先定义一个Developer接口

// Developer.java
public interface Developer {
    void product();
}

再定义两个Developer接口的两个实现类:

// DeveloperOne.java
public class DeveloperOne implements Developer {
    @Override
    public void product() {
        System.out.println("Hi, I am DeveloperOne.");
    }
}
// DeveloperTwo.java
public class DeveloperTwo implements Developer {
    @Override
    public void product() {
        System.out.println("Hi, I am DeveloperTwo.");
    }
}

然后再在项目resources目录下新建一个META-INF/services文件夹,然后再新建一个以Developer接口的全限定名命名的文件,文件内容为:

// com.test.Developer文件

com.ymbj.spi.DeveloperOne
com.ymbj.spi.DeveloperTwo

最后我们再新建一个测试类JdkSPITest:

// SPITest.java

public class SPITest {

    @Test
    public void testSayHi() throws Exception {
        ServiceLoader<Developer> serviceLoader = ServiceLoader.load(Developer.class);
        serviceLoader.forEach(Developer::product);
    }
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值