SPI 全名 Service Provider Interface ,是java提供的 一个 服务接口拓展机制。使用SPI 可以轻松的修改接口的实现方式。
例子代码:
创建一个接口:
创建2个实现类:
然后再classpath下面创建 META-INF/services 两个目录
在 META-INF/services 里面建一个文件名为接口全称的文件:com.lomi.spi.MyInterface
文件里面写着接口的实现类的全类名:com.lomi.spi.Impl2
然后我们通过 ServiceLoader 获取接口实现,可以拿到我们指定接口实现类。
很多jar都是通过这种方式来切换接口实现类的,比如 SLF4j 导入对应的装换包,就会换成对应的实现, 原理就是 对应的实现包里面 指定了实现类
dubbo 的 SPI 也是类似的机制,但是支持 实现key名字=实现类全名格式,,并且可以在接口上指定默认使用那个key对应的实现,获取接口实现类是通过 ExtensionLoader 来获取的
获取指定 key 的实现类,和查看有那些实现
如果要在接口上指定默认实现可以使用直接 @SPI(“默认实现的key”)