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机制

  • 相关阅读:
    ssh无密码登录 及集群分发脚本
    Hbase安装及客户端测试及笔记
    Zookeeper 的分布式安装部署及客户端测试
    搭建hadoop-完全分布式模式
    虚拟机的linux没有mac地址
    servlet-Listener 的复习
    纯servlet 达到spring的自动装配
    JDBC的复习 和工具类总结
    C#中的弱事件(Weak Events in C#)
    WeakReference(弱引用)
  • 原文地址:https://www.cnblogs.com/jmcui/p/12363239.html
Copyright © 2011-2022 走看看