• java SPI初步


    java开发者对API应该很熟悉,程序员自己实现一个接口,然后自己实现,然后把接口开发给其他人使用,这是API。

    还有一个东东叫SPI,英文为Service Provider Interface,可以理解为Service提供者接口,大概的逻辑是框架设计者制定一个规范,开发给第三方实现,然后自己使用。

    我们日常最常见的应该就是JDBC了,数据库有很多种,java不可能自己都一一实现,于是制定了jdbc规范,由各个数据库厂家实现具体的创建连接、查询数据、返回结果等内容。

    SPI机制的约定:

    1)         在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名

    2)         使用ServiceLoader类动态加载META-INF中的实现类

    3)         如SPI的实现类为Jar则需要放在主程序classPath中

    4)         Api具体实现类必须有一个不带参数的构造方法

    比如我们都使用过云盘,如果要开发一个功能,可以运行用户将自己的文件上传到多种不同的云盘上,每个云盘厂商的实现肯定是不同的。

    我们只负责定义一个接口:

    package com.example.api.plugin;
    
    public interface UploadFile {
        void upload(String var1);
    }

    云盘厂家A想跟我们合作,于是他需要实现自己的上传过程

    package com.example.api.plugin;
    
    public class UploadFileA implements UploadFile {
        public UploadFileA() {
        }
    
        public void upload(String fileName) {
            System.out.println("UploadFileA upload " + fileName);
        }
    }

    同样云盘厂家B,也需要实现我们的接口

    package com.example.api.plugin;
    
    public class UploadFileB implements UploadFile {
        public UploadFileB() {
        }
    
        public void upload(String fileName) {
            System.out.println("UploadFileB upload " + fileName);
        }
    }

    他们将自己的代码以jar包的形式共享出来。jar包需要满足META-INF/services/有接口的同名文件,里面是实现类的全名。

    当然,在开发的时候这些内容是在Resource目录下的

     理论上,我们不知道第三方厂家具体的实现细节,我们只需要调用就可以了。

    依赖好第三方jar包,然后我们写一个main方法

    public class Main {
        public static void main(String[] args) {
            ServiceLoader<UploadFile> uploadCDN = ServiceLoader.load(UploadFile.class);
            for (UploadFile u : uploadCDN) {
                u.upload("myFile");
            }
        }
    }

    输出:

    UploadFileA upload myFile
    UploadFileB upload myFile

    完美!

    main函数里面也没有啥,最重要的是ServiceLoader,它是jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

    这样就可以实现框架与插件的解耦合

    参考:

    https://www.cnblogs.com/jy107600/p/11464985.html

    https://www.cnblogs.com/googlemeoften/p/5715262.html

    https://www.jianshu.com/p/3a3edbcd8f24

  • 相关阅读:
    C++中的类模板详细讲述
    函数模板和模板函数
    vs2008 快捷键大全
    #宏定义##
    多工程项目设置
    conemu 配置
    itcast-svn
    itcast-spring-三大框架整合
    Spring通知方法错误
    动态代理
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15246138.html
Copyright © 2020-2023  润新知