美文网首页
java spi demo实现

java spi demo实现

作者: arkliu | 来源:发表于2022-11-10 11:43 被阅读0次

实现端工程

image.png

Log接口

package com.test.spi;

public interface Log {
    public void printLog(String str);
}

AdbLog 实现类

package com.test.spi.impl;

import com.test.spi.Log;

public class AdbLog implements Log {

    @Override
    public void printLog(String str) {
        System.out.println("from AdbLog:"+str);
    }

}

Log4j实现类

package com.test.spi.impl;

import com.test.spi.Log;

public class Log4j implements Log {

    @Override
    public void printLog(String str) {
        System.out.println("from log4j:"+str);
    }

}

实现端

image.png

Log接口声明

package com.test.spi;

public interface Log {
    public void printLog(String str);
}

  • 新建“META-INF/services/” 目录,目录名字要严格一致,因为ServiceClassLoader里是定义了这样的路径


    image.png
  • 在“META-INF/services/” 目录下新建一个文件,文件名称为,声明接口的全类名。 本例为:"com.test.spi.Log"
  • 第二步新建的"com.test.spi.Log"文件的内容为,Log接口实现类的全类名,如下:


    image.png
  • 使用ServiceLoader加载实现类。
package com.test.spi;

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

import com.test.spi.impl.Log4j;

public class TestLog {

    public static void main(String[] args) {
        // 1. 获取原本的ClassLoader
        ClassLoader originalLoader = Thread.currentThread().getContextClassLoader();
        try {
            ServiceLoader<Log> serviceLogs = ServiceLoader.load(Log.class);
            // 2. 使用自定义的ClassLoader
//          ServiceLoader<Log> serviceLogs = ServiceLoader.load(Log.class, 这里可以写自定义的ClassLoader);
            Iterator<Log>iterLogs = serviceLogs.iterator();
            while (iterLogs.hasNext()) {
                Log log = iterLogs.next();
                System.out.println(log.getClass());
                if (log instanceof Log4j) {
                    log.printLog("hello");
                } else {
                    log.printLog("spi");
                }
            }
        } finally {
            //3.恢复原本的ClassLoader
            Thread.currentThread().setContextClassLoader(originalLoader);
        }
    }
}

执行结果:


image.png

相关文章

  • JDBC【4】-- SPI底层原理解析

    前面已经讲过SPI的基本实现原理了,demo也基本实现了,再来说说SPI。 http://aphysia.cn/a...

  • java SPI入门详解

    Java SPI机制详解 1、什么是SPI? ​ 如上图所示,接口对应的抽象SPI接口;实现方实现SP...

  • SPI原理解析一

    SPI(service provider Interfaces),对于Java中的实现SPI类ServiceLoa...

  • Java spi 和Spring spi

    Java spi 和Spring spi service provider framework是一个系统, 实现了...

  • Java中的SPI机制及接口多实现调用

    Java中的SPI机制及接口多实现调用 0x00 SPI机制 SPI 全称为 (Service Provider ...

  • Java SPI 机制解析

    本文以JDBC为例深入讲解 java spi 机制,将帮助你理解:什么是SPI,SPI实现原理,SPI的使用和SP...

  • Android 动态服务SPI--模块节藕

    一、什么是SPI SPI即Service Provider Interfaces。Java的接口可以有多种实现方式...

  • SPI机制

    SPI的全名为Service Provider Interface,是Java实现面向接口的解耦机制。通过SPI,...

  • java原生SPI

    SPI概念 spi提供了一种机制可以用来被第三方扩展和实现 spi的核心作用就是为这些api寻找实现 java原生...

  • Java - SPI机制

    Java - SPI机制 SPI是什么 SPI全称Service Provider Interface,是Java...

网友评论

      本文标题:java spi demo实现

      本文链接:https://www.haomeiwen.com/subject/vmuatdtx.html