SPI

SServicepproviderIInterface。它一般由三个组件组成:

Service

是一个公共的接口或抽象类,定义了一个抽象的功能模块

Service Provider

是Service的一个实现类

ServiceLoad

SPI中的核心组件,它用来发现并加载Service Provider

SPI的运行流程

启动一个Application程序后,调用ServiceLoad的load()方法,得到provider,也就是接口的实现类,这时候返回给Application,这时候返回的是个接口类型的,然后就进行下一步操作了。

它不关系Service实现类是怎么实现的,只需要和Service接口进行交互即可。

SPI的三个规范

一:规范的配置文件;必须在jar包中的META-INF/services目录下,文件名称是接口的全限定名;内容是接口的实现类的全限定名,一行一个实现类的全限定名。

二:Service Provider类必须具备默认的无参构造方法;

三:保证能加载到配置文件和Service Provider类;如利用maven将jar包作为依赖引入;如将Service Provider类放在classpath中。

SPI的作用

提供了组件发现和注册的方式,可以灵活切换各种插件。

SPI的优点

面向接口编程,实现模块与模块之间的解耦。

springboot自动配置

springboot应用程序启动,通过SpringFactories机制加载配置文件,筛选出key为EnableAutoConfiguration的value值,然后去加载这些配置类,然后将这些类注入到Spring IOC容器当中。

SpringFactories机制是Java SPI机制的延伸和扩展。