• java SPI机制


    1、 SPI是Service Provider Interfaces的简称。根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务提供者)。然后在使用的时候只要根据SPI的规范去获取对应的服务提供者的服务实现即可

    SPI机制的约定:

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

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

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

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

    参考此博客:https://blog.csdn.net/zmx729618/article/details/53285416?utm_source=copy 

    实例代码如下:

    package com.rookie.bigdata;
    
    /**
     * Created by  on 2018/9/29.
     */
    public interface SPIService {
    
        public void print(String msg);
    }
    package com.rookie.bigdata;
    
    /**
     * Created by  on 2018/9/29.
     */
    public class TJService implements  SPIService {
        @Override
        public void print(String msg) {
            System.out.println("天津市");
        }
    }
    
    
    package com.rookie.bigdata;
    
    /**
     * Created by  on 2018/9/29.
     */
    public class BJService implements  SPIService {
        @Override
        public void print(String msg) {
            System.out.println("北京市");
        }
    }

    com.rookie.bigdata.SPIService文件内如如下:

    #BJ
    com.rookie.bigdata.BJService
    #TJ
    com.rookie.bigdata.TJService

    测试代码

    package com.rookie.bigdata;
    
    import org.junit.Test;
    
    import java.util.ServiceLoader;
    
    /**
     * Created by  on 2018/9/29.
     */
    public class SPITest {
    
        @Test
        public void test1() {
    
            ServiceLoader<SPIService> serviceLoader = ServiceLoader.load(SPIService.class);
            SPIService spiService = null;
            for (SPIService service : serviceLoader) {
    
                service.print("SPI");
            }
        }
    }
  • 相关阅读:
    Egret Inspector google 插件 浏览器报错的解决方案:
    egret 项目 支持 es6 解决方案
    promise-abortable
    BaseSocket
    【译】async/await 优点、陷阱以及如何使用 (经验总结)
    WebSocket 断线重连引入心跳的原因
    node js 项目: 采用typescript 编写的好文章
    创建Node.js TypeScript后端项目 demo
    vs code 提高工作效率的办法:
    cocos2d-x 贝塞尔曲线(Bezier)用法详解
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/9723351.html
Copyright © 2020-2023  润新知