java中spi使用详解

 更新时间:2020年09月03日 08:54:47   作者:panda-star  
java中spi(service provider interface)是jdk内置的一种服务发现机制,可以基于配置,在运行时加载指定服务。这篇文章主要介绍了java中spi使用,需要的朋友可以参考下

一、简介

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

1.什么是SPI

     SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。

2.SPI和API的使用场景

    API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。 从使用人员上来说,API 直接被应用开发人员使用。

    SPI (Service Provider Interface)是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现。  从使用人员上来说,SPI 被框架扩展人员使用。

二、开发步骤

spi开发中,涉及接口、实现类、配置文件和服务加载,具体开发步骤如下:

定义接口和实现类(可多个);

在项目resources目录下创建META-INF/services文件夹,接着在services文件夹下创建以接口完整类路径名(包含包路径和接口名)为文件名的文件,文件内容为需要加载的服务(实现类)的完整类路径名,一行一个;
目录结构类似:

resources--
|-services--
|-com.dragon.study.spring_boot_main.spi.Hello

文件内容类似:

com.dragon.study.spring_boot_main.spi.HelloOne
com.dragon.study.spring_boot_main.spi.HelloTwo

在启动类中加载服务,代码类似:

//加载方式一
Iterator<Hello> it = Service.providers(Hello.class);
while(it.hasNext()){
	it.next().hello();
}

//加载方式二
ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
for (Hello h : hellos){
	h.hello();
}

三、使用示例

3.1 定义接口和实现类

接口:

package com.dragon.study.spring_boot_main.spi;
public interface Hello {
  void hello();
}

实现类一:

package com.dragon.study.spring_boot_main.spi;
public class HelloOne implements Hello {
  @Override
  public void hello() {
    System.out.println("hello one");
  }
}

实现类二:

package com.dragon.study.spring_boot_main.spi;
public class HelloTwo implements Hello {
  @Override
  public void hello() {
    System.out.println("hello two");
  }
}

3.2 定义配置文件

在resources/META-INF/services目录下创建配置文件com.dragon.study.spring_boot_main.spi.Hello,内容如下:

com.dragon.study.spring_boot_main.spi.HelloOne
com.dragon.study.spring_boot_main.spi.HelloTwo

3.3 启动类中加载服务

package com.dragon.study.spring_boot_main.spi;

import sun.misc.Service;

import java.util.Iterator;
import java.util.ServiceLoader;

public class SpiMain {
  public static void main(String[] args) {
    //加载方式一
//    Iterator<Hello> it = Service.providers(Hello.class);
//    while(it.hasNext()){
//      it.next().hello();
//    }

    //加载方式二
    ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
    for (Hello h : hellos){
      h.hello();
    }
  }
}

启动后输出:

hello one
hello two

总结

到此这篇关于java中spi使用的文章就介绍到这了,更多相关java中spi使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中文件写入内容的几种常见方法

    Java中文件写入内容的几种常见方法

    本文主要介绍了Java中文件写入内容的几种常见方法,主要包括使用NIO的Files工具类、通过commons-io的FileUtils工具类、RandomAccessFile、PrintWriter和BufferedWriter这几种,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 一篇文章带你深入了解Java线程池

    一篇文章带你深入了解Java线程池

    这篇文章主要介绍了Java 线程池的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • ant使用指南详细入门教程

    ant使用指南详细入门教程

    这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装、验证安装、使用方法、使用实例、ant命令等内容,需要的朋友可以参考下
    2015-06-06
  • Java Calendar类使用之日期和时间处理指南

    Java Calendar类使用之日期和时间处理指南

    这篇文章主要给大家介绍了关于Java Calendar类使用之日期和时间处理指南的相关资料,Calendar类是Java中用于处理日期和时间的抽象类,它提供了一种独立于特定日历系统的方式来处理日期和时间,需要的朋友可以参考下
    2023-12-12
  • 图文详解JAVA实现快速排序

    图文详解JAVA实现快速排序

    这篇文章主要给大家介绍了关于JAVA实现快速排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java读取txt文件和写入txt文件的简单实例

    Java读取txt文件和写入txt文件的简单实例

    下面小编就为大家带来一篇Java读取txt文件和写入txt文件的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • SpringBoot中如何进行统一异常处理

    SpringBoot中如何进行统一异常处理

    大家好,本篇文章主要讲的是SpringBoot中如何进行统一异常处理,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • IDEA自动生成TestNG的testng.xml的插件方法

    IDEA自动生成TestNG的testng.xml的插件方法

    这篇文章主要介绍了IDEA自动生成TestNG的testng.xml的插件方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • JDK源码白话解读之ThreadLocal篇

    JDK源码白话解读之ThreadLocal篇

    其实网上有很多关于ThreadLocal的文章了,有不少文章也已经写的非常好了。但是很多同学反应还有一些部分没有讲解的十分清楚,还是有一定的疑惑没有想的十分清楚
    2022-02-02
  • Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解

    这篇文章主要介绍了Java try catch finally异常处理组合详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论