java spi 详解_SPI应用场景及详解

java中spi(service provider interface)是jdk内置的一种服务发现机制,可以基于配置,在运行时加载指定服务。java中提供了很多服务提供接口,如jdbc、jndi等。

面对分布式的开发,很多系统之间的调用都是使用rpc直接调用,但是有的时候上游的系统需要调用下游系统很多的接口,导致开发工作量很大。因此上游系统使用spi的方式在jar包中打一个spi接口,让下游的业务实现这个spi接口,上游的系统则可以通用的调用这一个接口就可以使用不同的功能。

下游业务方的实现:

一般我们需要设计如何实现spi接口,那实现的最简单的方式就是implements这个spi接口,这种实现方式不利用后续的扩展。

新建maven  工程

c1e4dae69eaa1fe690ec04e254bbafd0.png

服务调用者先定制接口结构,然后提供给服务提供者进行实现,服务提供者按照接口规范,实现,然后在resources/META-INF/services目录,然后在下面新建文件,文件名为接口的路径,图为org.springboot.produce.service.IMsgService

39ffb18795d8339bf36cb34d58735b41.png

文件内容为

e5972620af5b220a5a71219e97ad38ce.png

里面是接口实现类路径

接口:

public interface IMsgService{

public boolean accept(String msg);

public void sendMsg(String msg);

public String getName();

}

实现KafkaMsgServiceImpl

public class KafkaMsgServiceImpl implements IMsgService{

@Override

public boolean accept(java.lang.String msg) {

// TODO Auto-generated method stub

if(msg.equals(getName()))

return true;

return false;

}

@Override

public void sendMsg(java.lang.String msg) {

// TODO Auto-generated method stub

System.out.println("KafkaMsgServiceImpl "+msg);

}

@Override

public java.lang.String getName() {

// TODO Auto-generated method stub

return "KafkaMsgServiceImpl";

}

}

实现QueueMsgServiceImpl

public class QueueMsgServiceImpl implements IMsgService{

@Override

public boolean accept(String msg) {

// TODO Auto-generated method stub

if(msg.equals(getName()))

return true;

return false;

}

@Override

public void sendMsg(String msg) {

// TODO Auto-generated method stub

System.out.println("QueueMsgServiceImpl "+msg);

}

@Override

public String getName() {

// TODO Auto-generated method stub

return "QueueMsgServiceImpl";

}

}

然后将springboot-produce工程 maven打包 安装到本地maven仓库  , mvn  install命令,打包后 ,别的工程(bundle)就可以依赖进去,进行调用

1604e3de024d87a90feb305c777763cd.png

新建消费者maven工程  springboot-consume

f3c295b91cf7839c2dfb775a2b36f4b1.png

pom.xml (springboot-produce为上面服务提供者的jar,这里要依赖引入)

seckill

springboot-produce

1.0.0-SNAPSHOT

在springboot-consume新建测试类  App

public class App

{

public static void main( String[] args )

{

ServiceLoader peoples = ServiceLoader.load(IMsgService.class);

Iterator iterator = peoples.iterator();

while (iterator.hasNext()) {

IMsgService msgService = iterator.next();

if(msgService.accept(msgService.getName())){

msgService.sendMsg("测试");

}

}

}

}

springboot-consume启动类会扫描本地及依赖包下resources/META-INF/*下 有无以该接口org.springboot.produce.service.IMsgService命名的文件。

运行

529a0ed8cac8fb37cb0900426f4200b6.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值