JavaSPI机制的示例分析

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

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、网页空间、营销软件、网站建设、招远网站维护、网站推广。

在平时开发项目的过程中,相信很多读者都看到过这样的目录,/META-INF/services目录,该目录下的文件名是接口的全称,其内容是具体的接口实现。这就是使用了SPI机制。如:

  • MySQL-connector

Java SPI机制的示例分析

  • JDK中的nio SPI

Java SPI机制的示例分析

再如,logback-classic

Java SPI机制的示例分析

接下来,我们就来聊聊java SPI机制

一、SPI概念和规范

1.1 SPI概念

SPI全称为  Service Provicder Interface,是JDK内置的一种服务提供发现功能,一种动态替换发现的机制。
举个例子,要想在运行时动态给一个接口添加实现,只需要添加一个实现即可。比如JDBC的数据库驱动模块,不同数据库连接驱动接口相同但实现类不同,通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。客户端使用jdbc时不需要去改变代码,直接引入不同的spi接口服务即可。  

1.2 SPI规范

使用SPI也需要遵循一定的规范,主要包含如下几点:

  • 需要设置/META-INF/目录

    • /META-INF/services

    • 放到classpath下

  • /META-INF/services/目录下放置配置文件

    • 文件名是接口全路径名

    • 文件内部是要实现的接口实现类

    • 文件编码为UTF-8

  • 使用ServiceLoad的load方法


二、SPI示例

  • 编写一个GreetingService接口

package com.wangmengjun.tutorial.spi;
public interface GreetingService {
 void sayHello();}
  • 编写2个实现类,分别输出英文和中文

package com.wangmengjun.tutorial.spi.impl;
import com.wangmengjun.tutorial.spi.GreetingService;
public class EnglishGreetingServiceImpl implements GreetingService{
 public void sayHello() {    System.out.println("Hello , This is SPI");      }
}
package com.wangmengjun.tutorial.spi.impl;
import com.wangmengjun.tutorial.spi.GreetingService;
public class ChineseGreetingServiceImpl implements GreetingService {
 public void sayHello() {    System.out.println("你好,这是SPI");      }
}
  • 创建META-INF文件目录并设置实现类

Java SPI机制的示例分析

  • 使用ServiceLoader

package com.wangmengjun.tutorial.spi;
import java.util.Iterator;import java.util.ServiceLoader;
public class SpiMain {
 public static void main(String[] args) {        ServiceLoader<GreetingService> loader= ServiceLoader.load(GreetingService.class);      Iterator<GreetingService> greetingIter = loader.iterator();      while(greetingIter.hasNext()) {          GreetingService service=  greetingIter.next();          System.out.println(service.getClass().getName());          service.sayHello();      }  }}

输出:

com.wangmengjun.tutorial.spi.impl.EnglishGreetingServiceImplHello , This is SPIcom.wangmengjun.tutorial.spi.impl.ChineseGreetingServiceImpl你好,这是SPI

经过上述几个步骤,一个spi的简单示例就完成了。

当执行ServiceLoader.load(GreetingService.class)构造完ServiceLoader实例我们可以看到这个时lookupIterator1的值还是null的。这个时候还没有去读取配置文件中的实现类信息。
    // The lazy-lookup iterator for iterator operations    private Iterator<Provider<S>> lookupIterator1;    private final List<S> instantiatedProviders = new ArrayList<>();

Java SPI机制的示例分析

当使用迭代器去遍历的时候,才会读取对应的配置文件去解析,调用hasNext方法的时候会去加载配置文件进行解析。文件读取采用BufferedReader的readLine来读取并解析。

Java SPI机制的示例分析

Java SPI机制的示例分析

Java SPI机制的示例分析

从上述的示例可以看出:虽然ServiceLoader也算是使用的延迟加载,但是需要通过迭代器迭代获取  ,所有配置的实现类都要实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。  

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

网站名称:JavaSPI机制的示例分析
标题来源:https://www.cdcxhl.com/article8/jhdiip.html

成都网站建设公司_创新互联,为您提供网页设计公司网站维护网站导航企业建站外贸建站移动网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

商城网站建设