美文网首页
(SPI)1.JAVA SPI

(SPI)1.JAVA SPI

作者: 无聊之园 | 来源:发表于2019-06-06 08:52 被阅读0次

    总结:就是javase约定好规范,然后就能通过serviceLoader,来找到具体的实现类。
    这样,上层可以直接接口调用,然后下层应用比如依赖jar包,去不同的实现这个接口,然后把这个接口实现类放到META-INF/services/路径就好了,来达到各自的需求。简单的例子,比如不同数据库的jdbc驱动包。

    SPI其实就是一种约定好规范,规定好在classpath下的META-INF/services/路径下,放置指定接口的指定实现类,然后java提供了ServiceLoader类,这个类会去读取这个文件,然后通过文件中指定的接口实现类,然后class.forName()加载这个类。

    比如jdbc的驱动包,java.sql.Driver只是一个接口,oracle 的驱动包ojdbc.jar在META-INF/services下就有文件以java SPI的规范指定了这个接口的实现类。
    所以在这种规范下,有很好的扩展性。只要依赖不同的jar包,就有不同的实现。

    这里有个网上的例子:

    public interface IShout {
        void shout();
    }
    public class Dog implements IShout {
        @Override
        public void shout() {
            System.out.println("wang wang");
        }
    }
    public class Cat implements IShout {
    
        @Override
        public void shout() {
            System.out.println("miao miao");
        }
    }
    META-INF/services/org.foo.demo.IShout文件内容
    org.foo.demo.Dog
    org.foo.demo.Cat
    
    测试
    public class SPIMain {
        public static void main(String[] args) {
            ServiceLoader<IShout> shouts = ServiceLoader.load(IShout.class);
            for (IShout s : shouts) {
                s.shout();
            }
        }
    }
    

    既然是一个约定好的规范,那么,自然,你也可以约定好一个规范,然后自己做一个类似serviceLoader的加载器,然后去加载实现类就可以了,只要,让别人遵守这个规范就好了,比如,dubbo。

    相关文章

      网友评论

          本文标题:(SPI)1.JAVA SPI

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