JavaSPI在分布式项目的简单示例
在分布式项目中都会有一个common的公共资源项目,在此项目中有一个通用的方法及可供调用的接口类,这些接口类可以供其他的项目实现。此时当有一个项目想要调用一部分实现该类的方法的时候,就可以使用SPI机制。springboot中加载自动配置类的时候就是使用的该机制。
1、首先创建一个公共的项目,并创建接口类及抽象方法。
public interface PayService {
public void pay();
}
2、创建一些项目,引用common项目,然后创建PayService的实现类。
public class AliPay implements PayService {
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
public class WxPay implements PayService {
@Override
public void pay() {
System.out.println("微信支付");
}
}
3、创建一个测试项目,只调用AliPay中的pay方法。
(1)在测试项目中添加common和AliPay所在项目的依赖;
(2)创建一个测试类,使用ServiceLoader加载抽象类,返回的ServiceLoader是Iterable类型的。
public class MainTest {
public static void main(String[] args) {
ServiceLoader<PayService> serviceLoader = ServiceLoader.load(PayService.class);
for (PayService payService : serviceLoader) {
payService.pay();
}
}
}
(3)此时还是发现调用不到AliPay中的方法,因为ServiceLoader会去查找所有依赖的项目中classPath下的“META/services”文件夹下的与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名:
com.test.AliPay
此时再去执行上述方法就可以直接调用到了。