美文网首页
java spi学习及仿数据库driver spi实现

java spi学习及仿数据库driver spi实现

作者: tic_smtc | 来源:发表于2018-10-17 22:10 被阅读0次

    最近在看dubbo源码,了解到spi机制,其实之前有了解,只是没有花时间去弄清楚

    网上看到很多将spi跟api对比,spi就像给浏览器装插件,浏览器预留了接口,按照这个接口规范去开发插件即可

    很多spi的demo都是定义一个service,然后写两个实现serviceA,serviceB并将其添加到META-INF/services目录文本文件下,然后通过ServiceLoader获取实例,然而这样看不到其明显的优点及作用。

    我们接触的与spi相关的应用场景主要有数据库driver及日志LogFactory,因此写个模拟数据库driver加载的spi实例来帮助理解

    代码结构如下:


    主要代码逻辑有

    DriverManager中静态块触发ServiceLoader去实例化类

    static {

    loadInitialDrivers();

    }

    private static void loadInitialDrivers() {

    ServiceLoader loadeDrivers = ServiceLoader.load(CustomDriver.class);

        Iterator driverIterator = loadeDrivers.iterator();

        while (driverIterator.hasNext()) {

    driverIterator.next();

        }

    }


    Driver将自身注册到DriverManager

    static {

    CustomDriverManager.registerDriver(new CustomDriver());

    }


    记得原来连接mysql经常见到Class.forName("com.mysql.jdbc.Driver"),那时只知道这样写才行,不知道为什么一定要这么写

    这句话的主要目的是初始化类,执行其static块,将其Driver添加到DriverManager中;但现在通过spi来自动扫描创建对象已包含了初始化过程,

    因此现在连接mysql数据库,实质上是不需要这句了的

    demo代码地址:https://github.com/ticsmtc6/spi-demo

    个人理解:spi是非必须的,实质上如果服务不是很复杂,预期不是经常添加扩展的话,用spring配置两个服务更简单

    相关文章

      网友评论

          本文标题:java spi学习及仿数据库driver spi实现

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