前言:
SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦
1、大家都知道API,却不太了解SPI
2、API是开发人员设定好的接口和实现功能供别人调用
3、SPI是制定接口规范,供其他服务提供模块来实现
一、Java标准SPI的构成三大组件
1、Service 是一个公开的接口或抽象类,定义了一个抽象的功能方法函数
2、Service Provider:是 Service 接口的一个实现类
3、ServiceLoader:SPI机制中的核心组件,负责运行时发现并加载 Service Provider
二、Java SPI的三大要素
1、文件位置路径:必须在JAR包(项目模块)中 /resources/META-INF/services/ 目录下
2、文件名称:Service接口或抽象类的全限定名
3、文件内容:Service接口或抽象类的实现类的全限定名。如果有多个实现类,那么每一个类在文件中单独占一行
使用:
1、当服务的提供者提供了一种接口的实现之后,需要在 classpath下的 /META-INF/services/ 目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类
2、当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的 /resources/META-INF/services 中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。
3、JDK中查找提供服务实现的工具类是:java.util.ServiceLoader
总结:
1、Java SPI机制,基于面向接口编程,优雅的实现模块之间的解耦