zoukankan      html  css  js  c++  java
  • 【深入浅出-JVM】(77):SPI

    概念

    Service Provider Interface

    规则

    1. 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名
    2. 接口实现类在classpath路径下
    3. 主程序通过 java.util.ServiceLoader 动态装载实现模块(扫描META-INF/services目录下的配置文件找到实现类,装载到 JVM)

    好处

    解耦,主程序和实现类之间不用硬编码

    例子

    package com.mousycoder.mycode.thinking_in_jvm;
    
    /**
     * @version 1.0
     * @author: mousycoder
     * @date: 2019-09-16 16:14
     */
    public interface SPIService {
        void execute();
    }
    
    
    package com.mousycoder.mycode.thinking_in_jvm;
    
    /**
     * @version 1.0
     * @author: mousycoder
     * @date: 2019-09-16 16:16
     */
    public class SpiImpl1 implements SPIService {
        @Override
        public void execute() {
            System.out.println("SpiImpl1.execute()");
        }
    }
    
    
    package com.mousycoder.mycode.thinking_in_jvm;
    
    /**
     * @version 1.0
     * @author: mousycoder
     * @date: 2019-09-16 16:16
     */
    public class SpiImpl2 implements SPIService {
        @Override
        public void execute() {
            System.out.println("SpiImpl2.execute()");
        }
    }
    
    

    在 resources/META-INF/services/目录下创建文件名为com.mousycoder.mycode.thinking_in_jvm.SPIService的文件,内容
    com.mousycoder.mycode.thinking_in_jvm.SpiImpl1
    com.mousycoder.mycode.thinking_in_jvm.SpiImpl2

    主程序

    package com.mousycoder.mycode.thinking_in_jvm;
    
    import sun.misc.Service;
    
    import java.util.Iterator;
    import java.util.ServiceLoader;
    
    /**
     * @version 1.0
     * @author: mousycoder
     * @date: 2019-09-16 16:21
     */
    public class SPIMain {
    
        public static void main(String[] args) {
            Iterator<SPIService> providers = Service.providers(SPIService.class);
            ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);
    
            while (providers.hasNext()){
                SPIService ser = providers.next();
                ser.execute();
            }
    
            System.out.println("-----------------------");
            Iterator<SPIService> iterator = load.iterator();
            while (iterator.hasNext()){
                SPIService ser = iterator.next();
                ser.execute();
            }
        }
    }
    
    

    输出

    SpiImpl1.execute()
    SpiImpl2.execute()
    -----------------------
    SpiImpl1.execute()
    SpiImpl2.execute()
    
    我是浩哥,希望我的思考能帮到您!
  • 相关阅读:
    力扣第945题 使数组唯一的最小增量
    力扣第365题 水壶问题
    力扣面试题40 最小的k个数
    力扣第409题 最长回文串
    力扣第46题 全排列
    力扣第1160题 拼写单词
    力扣面试题01.06 字符串压缩
    力扣第695题 岛屿的最大面积
    树莓派 鼠标自动消失
    树莓派 VNC 远程桌面 同一个桌面
  • 原文地址:https://www.cnblogs.com/mousycoder/p/11528958.html
Copyright © 2011-2022 走看看