前面已经定义好了服务的契约接口以及服务的实现者(加法服务、乘法服务),
本文将开发一个服务消费者,所谓的消费者即消费服务,通过引入相应服务的jar包来自动消费相应的服务。
首先同样新建一个Java工程spi-consumer,
新建服务消费类com.fanyc.test.spi.consumer.Consumer,并添加可执行的main方法。
由于是服务消费者,必须要知道要消费的服务契约即接口定义,所以必须要引入服务契约的定义jar包spi-intface.jar。
消费服务代码如下:
package com.fanyc.test.spi.consumer;
import java.util.ServiceLoader;
import com.fanyc.test.spi.intface.Computer;
/**
* 服务消费者
* @author Fanyc
*
*/
public class Consumer {
public static void main(String[] args) {
ServiceLoader<Computer> sl = ServiceLoader.load(Computer.class);
if(sl == null || sl.iterator().hasNext() == false){
System.err.println("未发现服务提供商!");
return;
}
int a = 20;
int b = 5;
for(Computer cp : sl){
System.err.println(String.format("服务提供商【%s】执行结果:%s",cp.getClass().getName(),cp.compute(a,b)));
}
}
}
利用ServiceLoader.load方法来加载当前classpath中所有服务实现者。
如果没有服务实现者则返回结果为空,否则返回结果为实现了Iterable接口的列表,
可以通过for循环来遍历所有服务实现者。
在没有引入服务实现者jar包时,运行结果为:
引入spi-provider-add.jar包后,运行结果为:
服务提供商【com.fanyc.test.spi.provider.Add】执行结果:25
再引入spi-provider-multi.jar包后,运行结果为:
服务提供商【com.fanyc.test.spi.provider.Add】执行结果:25
服务提供商【com.fanyc.test.spi.provider.Multi】执行结果:100
由此可以看出SPI可以自动发现并调用服务实现者,而对于服务消费者无需知道到底有几个服务实现者甚至是没有服务实现者,只要在classpath中引用了服务实现者的jar包即可自动调用。
更多服务实现者如减法和除法可自行实现。
至此整个关于《SPI的入门级Demo》系列已经完成。