Java SPI作用及原理

在程序开发的时候,开发人员并不想对某些功能的实现写死,需要开放一些口子让其他部门或者第三方接入的时候灵活实现。这个时候就需要JAVA SPI机制。SPI机制可以帮助开发人员从配置文件中加载指定接口的实现类,这样就可以在不改动实现类的代码的前提下,更换或者添加接口的不同实现。可以做到灵活插拔。

spi的使用分为两种,可以使用java内置的spi,也可以使用spring封装的spi。

 

使用spi的步骤

1.创建接口和他的多个实现类

java spi 组件化 spi java spring_配置文件

java spi 组件化 spi java spring_java spi 组件化_02

java spi 组件化 spi java spring_java_03

2.在项目的Resource/META-INF/Services目录下创建一个和接口全限定名一样的文件,在里面写入接口的实现类的全限类名

java spi 组件化 spi java spring_配置文件_04

java spi 组件化 spi java spring_加载_05

3.使用serviceloader加载

java spi 组件化 spi java spring_java_06

java spi 组件化 spi java spring_java_07

可以看到会加载配置文件中写的实现类,并且会加载所有的实现类。

Spring SPI

Spring SPI是对java spi进行了封装增强,使用SpringFactories的loadFactories方法可以返回得到配置文件中写的实现类的集合,并且可以选择需要的某个实现类。

java spi 组件化 spi java spring_配置文件_08

查看源码可以发现,对配置文件位置也有要求

java spi 组件化 spi java spring_java_09

配置文件的内容需以 接口全限名 = 实现类全限名,换行“ \ ” ,区分符号 ","

java spi 组件化 spi java spring_java_10

输出结果:

java spi 组件化 spi java spring_java_11

对比不难发现,SpringSPI使用起来更方便,实现类的实例都存放在List集合中,调用方可以任意选择。

在项目中,只需要修改调用方的spring.factories文件和引入实现类的jar包,就可以快速选择适合的实现了。