SPI的使用场景

来源:互联网 发布:lol国服mac版本几时出 编辑:程序博客网 时间:2024/06/06 03:08

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

下游业务方的实现:

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

目前,在项目中,我使用注解+Spring容器启动的特性+面向接口+接口模版来实现。

比如我需要实现 上游接口

public interface SpiService{

public Result<T> process(Request request);

}

下游的实现

public class SpiServiceImpl implements SpiService{


 private SpiManager spiManager;

   public Result<T> process(Request request){

         return  spiManager.handle(request);

 }

}

public interface SpiManager{

public Result<T> handle(Request request);

}


public class SpiManagerImpl extends ApplicationObjectSupport implements SpiManager{

private Map<String ,ProcessSpi>  map=new HashMap<String,ProcessSpi>();

protected void initApplicationContext(ApplicationContext context) throws BeansException {    super.initApplicationContext(context);
    //设置不同的处理器,在spring容器启动之后,创建注解中key与具体实现的类映射
   //  map设值
}
public Result<T> handle(Request request){
     //根据上游传的key获取相应的spiProcess类进行处理
}    

}

public interface   SpiProcess{

   public Result  doProcess(Request  request);

}


public interface SpiProcessTemplate{

  public before(Request  request,Result<T>  result);

  public process(Request  request,Result<T>  result);

  public after(Request  request,Result<T>  result);

}

public abstract  class  AbstractSpiProcess implements SpiProcess,SpiProcessTemplate{

   public Result  doProcess(Request  request){

Result result=new Result();

before( request,  result);

  process( request,  result);

  after( request,  result);

return result;

   }

}



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



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


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

原创粉丝点击