• SPI


    https://www.jianshu.com/p/5c3bb771dc5d

    最近在学习dubbo源码,dubbo在功能扩展方面,提供了SPI的扩展。初次看到SPI,还是不容易理解,下面记录SPI的学习。
    系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。
    为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

    java spi的具体约定如下 :

    当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里指定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader。
    一个例子说明jdk的spi。假一个内容搜索接口,搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。

    package com.ywsc.fenfenzhong.spi.learn;
    import java.util.List;
    public interface Search {
        public List<String> searchDoc(String keyword);   
    }
    
    文件搜索实现
    package com.ywsc.fenfenzhong.spi.learn;
    import java.util.List;
    public class FileSearch implements Search{
        @Override
        public List<String> searchDoc(String keyword) {
            System.out.println("文件搜索 "+keyword);
            return null;
        }
    }
    
    数据库搜索实现
    package com.ywsc.fenfenzhong.spi.learn;
    import java.util.List;
    public class DatabaseSearch implements Search{
        @Override
        public List<String> searchDoc(String keyword) {
            System.out.println("数据搜索 "+keyword);
            return null;
        }
    }
    

    创建文件 com.ywsc.fenfenzhong.spi.learn.Search
    文件内容为 com.ywsc.fenfenzhong.spi.learn.FileSearch
    目录结构为

     
    屏幕快照 2016-04-06 下午11.04.53.png
    测试方法
    package com.ywsc.fenfenzhong.spi.learn;
    import java.util.Iterator;
    import java.util.ServiceLoader;
    public class TestCase {
        public static void main(String[] args) {
            ServiceLoader<Search> s = ServiceLoader.load(Search.class);
            Iterator<Search> iterator = s.iterator();
            while (iterator.hasNext()) {
               Search search =  iterator.next();
               search.searchDoc("hello world");
            }
        }
    }
    输出结果:文件搜索 hello world
  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/0xcafedaddy/p/8417709.html
Copyright © 2020-2023  润新知