SPI入门级Demo(一:初识)

最近在学习软件架构以及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

猜你喜欢

转载自fanyc.iteye.com/blog/2192068