SPI的使用场景

面对分布式的开发,很多系统之间的调用都是使用rpc直接调用,但是有的时候上游的系统需要调用下游系统很多的接口,导致开发工作量很大。因此上游系统使用spi的方式在jar包中打一个spi接口,让下游的业务实现这个spi接口,上游的系统则可以通用的调用这一个接口就可以使用不同的功能。
下游业务方的实现:
一般我们需要设计如何实现spi接口,那实现的最简单的方式就是implements这个spi接口,这种实现方式不利用后续的扩展。
目前,在项目中,我使用注解+Spring容器启动的特性+面向接口+接口模版来实现。
比如我需要实现 上游接口
【SPI的使用场景】public interface SpiService{
public Result process(Request request);
}
下游的实现
public class SpiServiceImpl implements SpiService{


private SpiManager spiManager;
public Result process(Request request){
returnspiManager.handle(request);

}

}
public interface SpiManager{
public Result handle(Request request);

}


public class SpiManagerImpl extends ApplicationObjectSupport implements SpiManager{
private Mapmap=new HashMapProcessSpi>();

protected void initApplicationContext(ApplicationContext context) throws BeansException { super.initApplicationContext(context);


//设置不同的处理器,在spring容器启动之后,创建注解中key与具体实现的类映射

//map设值

}

public Result handle(Request request){


//根据上游传的key获取相应的spiProcess类进行处理

}

}
public interfaceSpiProcess{
publicResultdoProcess(Requestrequest);
}


public interface SpiProcessTemplate{
public before(Requestrequest,Resultresult);
public process(Requestrequest,Resultresult);

public after(Requestrequest,Resultresult);

}
public abstractclassAbstractSpiProcess implements SpiProcess,SpiProcessTemplate{
public ResultdoProcess(Requestrequest){
Result result=new Result();


before( request,result);
process( request,result);

after( request,result);
return result; }

}




业务上具体实现类,extends AbstractSpiProcess就可以使用了。




最后将类配置到spring的文件中就ok


本文只是简单的说了一下 SPI的使用场景以及简单的实现。没有更具体的实现,需要根据不同的业务设计不同的实现框架

    推荐阅读