Java中的SPI
SPI
S
指Service
,p
指provider
,I
指Interface
。它一般由三个组件组成:
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机制的延伸和扩展。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.