Java中SPI机制的原理是什么

  介绍

这期内容当中小编将会给大家带来有关Java中SPI机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>概述

SPI(服务提供者接口),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql。司机接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。

Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。

<强> SPI整体机制图如下

癑ava中SPI机制的原理是什么"

当服务的提供者提供了一种接口的实现之后,需要在类路径下的meta - inf/服务/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的meta - inf/服务/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了.JDK中查找服务的实现的工具类是:java.util.ServiceLoader。

<强> java.util.ServiceLoader

首先,即便ServiceLoader实现了Iterable接口,所以它有迭代器的属性,这里主要都是实现了迭代器的hasNext和第二方法。这里主要都是调用的lookupIterator的相应hasNext和第二方法,lookupIterator是懒加载迭代器。

其次,LazyIterator中的hasNext方法,静态变量前缀就是“meta - inf/服务/蹦柯?这也就是为什么需要在类路径下的meta - inf/服务/目录里创建一个以服务接口命名的文件。

最后,通过反射方法forname()加载类对象,并用newInstance方法将类实例化,并把实例化后的类缓存到供应商对象中,(LinkedHashMap<字符串,S>类型),然后返回实例对象。

<强>演示

//定义一个接口HelloSPI。   package  com.vivo.study.spidemo.spi;   public  interface  HelloSPI  {   void 才能sayHello ();   }//完成接口的多个实现。   package  com.vivo.study.spidemo.spi.impl;   import  com.vivo.study.spidemo.spi.HelloSPI;   public  class  ImageHello  implements  HelloSPI  {   public 才能;void  sayHello (), {   ,,,System.out.println (“Image  Hello");   ,,}   }   package  com.vivo.study.spidemo.spi.impl;   import  com.vivo.study.spidemo.spi.HelloSPI;   public  class  TextHello  implements  HelloSPI  {   public 才能;void  sayHello (), {   ,,,System.out.println (“Text  Hello");   ,,}   }//在meta - inf/服务/目录里创建一个以com.vivo.study.spidemo.spi.HelloSPI的文件,这个文件里的内容就是这个接口的具体的实现类。   内容如下   com.vivo.study.spidemo.spi.impl.ImageHello   com.vivo.study.spidemo.spi.impl.TextHello//,使用,ServiceLoader 来加载配置文件中指定的实现   package  com.vivo.study.spidemo.test   import  java.util.ServiceLoader;   import  com.vivo.study.spidemo.spi.HelloSPI;   public  class  SPIDemo  {   public 才能;static  void  main (String [], args), {   ,,,ServiceLoader, serviceLoader =, ServiceLoader.load (HelloSPI.class);   ,,,//,执行不同厂商的业务实现,具体根据业务需求配置   ,,,for  (HelloSPI  HelloSPI :即便serviceLoader), {   ,,,,,helloSPI.sayHello ();   ,,,}   ,,}   }//输出结果如下:   Image 你好   Text 你好

<强>不足

1。不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费。

2。获取某个实现类的方式不够灵活,只能通过迭代器形式获取,不能根据某个参数来获取对应的实现类。

3。多个并发多线程使用即便ServiceLoader类的实例是不安全的。

上述就是小编为大家分享的Java中SPI机制的原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

Java中SPI机制的原理是什么