SPI:(service provider interface),服务提供接口,旨在为标准化的接口提供不同的服务,从而实现动态的发现服务的机制
调用方可以只提供接口,让服务提供方进行接口实现,然后调用方以调用接口的形式调用不同的服务实现。
java SPI最常见最典型的案例是jdbc,jdk定义了标准接口,mysql,oracle等各厂商分别作实现,以mysql-connector-java包为例:
在META-INF/services下的的java.sql.Dirver文件中声明了默认的实现类。
由上可见,Java SPI的主要组成部分为:
1.标准化的接口
2.服务提供方的实现
3.META-INF/services下的文件描述
4.java.util.ServiceLoader 的加载机制来实现类加载
测试demo:
1.新建一个服务提供方项目,有两个实现类
2.新建一个client项目,用于测试
使用ServiceLoader进行调用,
可以看到,直接获取了Test2ServiceImpl中的实现(dubbo中很多都用了这种方式实现动态变换)