最近在学习软件架构以及SOA等相关知识,在学习Dubbo的时候发现SPI这个东东,就上网百度来学习一下。
?
SPI的全名为Service Provider Interface。
?
我理解的SPI就是调用者只要说明调用什么接口的什么方法即可,无需知道具体的
实现者代码,也无需在代码中实现进行关联引用。这样就将调用方和实现方进行分离,
只要共通遵循接口协议就可以了。
?
具体SPI的实现过程:
1,调用方和实现方共同契约确定? --- 定义接口A
2,实现方实现共同契约接口A,命名为B
3,实现方的jar包中放入文件META-INF\services\接口类全名A,文件的内容为实现的类全名B
4,ServiceLoader在classpath中加载所有META-INF\services\下名称为接口类全名A的文件,将
里面的内容作为A的实现加载到JVM中。
5,调用方通过ServiceLoader来申明调用接口A,此时会找到所有实现了接口A的实现方
6,调用具体的实现方
?
在学习OSGi的时候一个典型的加减乘除的例子,拿过来用SPI实现一下:
1,输入参数a和b,
2,调用运算服务
3.1,这时候系统中如果有加法提供方的运算结果则返回a+b,
3.2,如果系统中减法提供方的则返回a-b,
3.3,乘法、除法同理。
?
这里只实现加法跟乘法做演示,
spi-intface: 申明了各方的契约,即接口定义
spi-provider-add:加法运算服务提供者,依赖spi-intface
spi-provider-multi:乘法运算服务提供者,依赖spi-intface
spi-consumer: 服务的调用者,依赖spi-intface,
如果提供加法运算则依赖spi-provider-add,
乘法运算则依赖spi-provider-multi