APi,大家都很熟悉,比如java的api文档,就描述的是jdk为我们开发人员准备了那些可以直接使用的方法,以供开发人员直接使用,从而达到某种功能的实现,比如我们需要得到对象的Hash值,那么可以直接调用Object.hashCode()方法就可以获取该对象对应的hash值了。API可以简单的理解为服务方暴露自己的服务供客户方调用,这里服务方就是JDK,客户方就是java开发人员
SPI,服务方提供的不在提供具体的方法,而是提供对象的接口,客户方需要实现接口,然后服务方调用客户方的接口实现类,再来实现客户的某种功能。SPI一般是给框架开发人员使用的,是一种实现功能的规范,接口也就是为了定义实现某种功能的规范,因此可以安装这个规范来实现很多种不能的实现类,比如java定义了链接数据库的接口【java.sql.Driver】,我们需要实现接口,但是数据库开发商如mysql或者oracle都开发了对应的驱动包,来链接自己的数据库,这些驱动包都实现了java定义的这个接口,实现的功能都是链接数据库,但是mysql的驱动包链接的是mysql,oracle驱动包链接的是oracle,这样我们需要链接mysql就依赖mysql的驱动包,我们需要链接orcale就用oracle的驱动包。SPI流程就是提供接口,实现接口,当客户需要实现某种功能的时候,服务方调用客户方的接口实现类来完成某种功能。比如mysql的驱动(接口实现类)就是SPI服务,当java开发人员需要链接mysql的时候,服务方调用的是mysql开发人员开发的驱动(接口实现类),来为java开发人员实现mysql的链接功能。