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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot整合Flowable6.x导出bpmn20的步骤详解

    Springboot整合Flowable6.x导出bpmn20的步骤详解

    这篇文章主要介绍了Springboot整合Flowable6.x导出bpmn20,Flowable流程引擎可用于部署BPMN 2.0流程定义,可以十分灵活地加入你的应用/服务/构架,本文给出两种从flowable导出流程定义bpmn20.xml的方式,需要的朋友可以参考下
    2023-04-04
  • Spring Boot 打包与热部署的操作方法

    Spring Boot 打包与热部署的操作方法

    这篇文章主要介绍了Spring Boot 打包与热部署的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot2整合ElasticJob框架过程详解

    SpringBoot2整合ElasticJob框架过程详解

    这篇文章主要介绍了SpringBoot2整合ElasticJob框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java文件基本操作总结

    Java文件基本操作总结

    今天给大家带来的是关于Java基础的相关知识,文章围绕着Java文件操作展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 学习Java中Class类及其用法

    学习Java中Class类及其用法

    这篇文章分为三大部分,主要内容有Class类原理详解、用法及泛化,需要的朋友可以参考下
    2015-07-07
  • java字节字符转换流操作详解

    java字节字符转换流操作详解

    这篇文章主要介绍了java字节字符转换流操作,结合实例形式详细分析了Java字符流转换相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java中内部类使用方法实战案例分析

    Java中内部类使用方法实战案例分析

    这篇文章主要介绍了Java中内部类使用方法,结合具体案例形式分析了Java内部类原理、调用方法及相关使用注意事项,需要的朋友可以参考下
    2019-09-09
  • java学习笔记_关于字符串概述

    java学习笔记_关于字符串概述

    下面小编就为大家带来一篇java学习笔记_关于字符串概述。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot中使用@scheduled定时执行任务的坑

    SpringBoot中使用@scheduled定时执行任务的坑

    本文主要介绍了SpringBoot中使用@scheduled定时执行任务的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • java8中@Contended注解的使用

    java8中@Contended注解的使用

    本文主要介绍了java8中@Contended注解的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论