SPI
全称是Service Provider Interface 它是从Java 6开始引入的,是一种基于
Class Loader来发现并加载服务的机制。
一个标准的SPI 由3个组件构成
-
Service
指的是一个接口或者抽象类,定义了一个抽象的功能模块 -
Service Provider
服务提供,实现了Service的功能 -
Service Loader
核心组件,负责在运行时发现并加载Service Provider
也可以这么理解,消费者只需要调用接口,而服务提供者以插件的形式,进行服务实现。消费者可以自由切换插件。也不用关心具体的实现,
配置文件的规范
- 文件路径必须在jar包的META-INF/services目录下
- 以接口的全限定名作为文件名称
- 以服务实现类的全限定名作为文件内容
下面看下代码演示
API模块定义了1个支付抽象类
上面是两个实现类,依赖了api包
上面是配置文件。
调用代码
看看效果,因为我这边依赖的是alipay模块,
怎么切换呢,只需要在jar包依赖这边切换就可以
切换为另一个服务支持。
有没有想起类似的什么呢?对的,JDBC 加载数据库驱动也是这样提供服务的。