zoukankan      html  css  js  c++  java
  • Java SPI机制简介

     

    SPI 简介

    SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现

    简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现

    而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。

    简单示例

    通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。 "" 我们首先需要一个目录,META-INFservices 如下,最终的目录路径就像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    └── src
    ├── com
    │   └── ivanzhang
    │       └── spi
    │           ├── HelloInterface.java
    │           ├── impl
    │           │   ├── ImageHello.java
    │           │   └── TextHello.java
    │           └── SPIMain.java
    └── META-INF
        └── services
            └── com.ivanzhang.spi.HelloInterface

    文件名字为 接口/抽象类: 全名 文件内容: 接口/抽象类 实现类

    就像这样: com.ivanzhang.spi.impl.TextHello com.ivanzhang.spi.impl.ImageHello

    接下来, 我们需要定义接口和实现类:

    1
    2
    3
    
    public interface HelloInterface {
      public void sayHello();
    }

    实现类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public class TextHello implements HelloInterface {
    
      @Override
      public void sayHello() {
          System.out.println("Text Hello.");
      }
    
    }
    
    public class ImageHello implements HelloInterface {
      @Override
      public void sayHello() {
          System.out.println("Image Hello");
      }
    }

    最后,来看看,如果使用SPI机制,客户端代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class SPIMain {
        public static void main(String[] args) {
    
            ServiceLoader<HelloInterface> loaders = 
                  ServiceLoader.load(HelloInterface.class);
    
            for (HelloInterface in : loaders) {
                in.sayHello();
            }
        }
    }

    最后的输出: Text Hello.Image Hello

  • 相关阅读:
    二维码
    文件下载
    相对路径使用的特殊符号
    Httpclient的使用
    MySQL比like语句更高效的写法
    jQuery中turn.js(翻页效果)学习笔记
    如何在忘记mysql的登录密码时更改mysql登录的密码(window及linux)
    详细介绍svn在eclipse中的使用(附图解说明)
    Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)
    利用workbench对linux/Ubuntu系统中的mysql数据库进行操作
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10758464.html
Copyright © 2011-2022 走看看