zoukankan      html  css  js  c++  java
  • JDK SPI 机制

    一、概述

    最早看到 SPI 这个机制是在 dubbo 实现 中,最近发现原来也不是什么新东西,竟然就是 JDK 中内置的玩意,今天就来一探究竟,看看它到底是什么玩意!

    SPI的全称是 Service Provider Interface,它是一种服务发现机制,它通过在 classPath 路径下的 META-INF/services 文件夹查找服务实现,自动加载文件里所定义的接口实现类。

    二、实现

    首先,我们定义了一个接口 HelloService.java 和它的两个实现类 HelloServiceImplA.java、HelloServiceImplB.java

    public interface HelloService {
    
        void hello();
    }
    
    public class HelloServiceImplA implements HelloService {
        
        @Override
        public void hello() {
            System.out.println("Hello! I am ImplA");
        }
    }
    
    public class HelloServiceImplB implements HelloService {
        
        @Override
        public void hello() {
            System.out.println("Hello! I am ImplB");
        }
    }
    

    接着,我们需要在 META-INF/services 下新建文件,文件名为接口全类名,文件内容即接口实现类全类名(多个实现类换行表示)。

    最后,就是我们服务发现过程了,需要借助 ServiceLoader 类。

    public class HelloServiceTest {
    
        public static void main(String[] args) {
            ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
            Iterator<HelloService> iterator = serviceLoader.iterator();
            while (iterator.hasNext()) {
                HelloService helloService = iterator.next();
                helloService.hello();
            }
        }
    }
    

    三、总结

    各位看官觉得如何?这种不用在程序中声明接口实现,又能够发起调用的方式,是不是让人觉得耳目一新!

    SPI 的底层实现基本使用了反射机制,通过全类名实例化接口实现,从而发起调用。

    SPI 机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。


    参考博文:
    1. 揭秘JDK SPI

    2. 深入理解SPI机制

  • 相关阅读:
    英语----非谓语动词to do
    英语----非谓语动词done
    英语----三大从句的混合实战
    英语----状语从句连接词(下)
    英语----状语从句连接词(中)
    英语----状语从句连接词(上)
    xcode7.3遇到的问题
    UIScrollView AutoLayout
    cocoapods 卸载  &  安装
    iOS即时通讯之CocoaAsyncSocket源码解析五
  • 原文地址:https://www.cnblogs.com/jmcui/p/12363239.html
Copyright © 2011-2022 走看看