SPI
大约 2 分钟
SPI
参考
1、什么是SPI
SPI
全名Service Provider interface
,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。 Java SPI
是JDK
内置的一种动态加载扩展点的实现。 这个机制在一般的业务代码中很少用到(个人接触到的业务没有用到过),但是再底层框架中却被大量使用,包括JDBC
、Dubbo
、Spring
框架、日志接口中都有用到,不同的是有的使用Java
原生的实现,有的框架则自己实现了一套SPI
机制
2、API 与 SPI
API
全称Application Programming Interface
, 翻译为“应用程序接口”,指的是应用程序为外部提供服务的接口,这个接口通常由服务提供者自行开发,定义好接口后很少改动。API
与SPI
示意图如图1,图2所示


一般应用(模块)之间通过接口进行通讯,服务提供方提供接口并进行实现后,调用方就可以通过调用这个接口拥有服务提供发提供的能力,这个就是API
当接口是由服务调用方提供,并且由服务提供方进行实现时,服务调用方就可以根据自己的需要选择特定实现,而不用更改业务代码以获取相应的功能,这个就是SPI
Java SPI的问题
Java SPI
虽然使用了懒加载机制,但是其获取一个实现时,需要使用迭代器循环加载所有的实现类- 当需要某一个实现类时,需要通过循环一遍来获取
这个两个问题,在Dubbo
实现自己的SPI
机制时进行了增强,可以仅加载自己想要的扩展实现。