美文网首页
Java中的SPI机制

Java中的SPI机制

作者: 一个头发茂密的程序员 | 来源:发表于2021-02-02 12:46 被阅读0次

    SPI机制:是JDK内置的一种提供服务发现的机制。动态的为某个接口寻找服务的实现,将装配的控制权移到程序之外。
    当服务的提供者提供了服务接口的一种实现之后,必须根据SPI约定在 META-INF/services/ 目录里创建一个以服务接口命名的文件,该文件里写的就是实现该服务接口的具体实现类。当程序调用ServiceLoader的load方法的时候,ServiceLoader能够通过约定的目录找到指定的文件,并装载实例化,完成服务的发现。

    例:JDBC的SPI机制

                   String url = "jdbc:mysql://localhost:3306/wangyiyun";
                   Connection conn = DriverManager.getConnection(url, "root", "123456");
                   // 拼写SQL语句
                   String sql = "select * from t_user where username = ? and password = ?";
                   // 4.调用执行者对象方法,执行SQL语句获取结果集
                   // 返回的是ResultSet接口的实现类对象,实现类在mysql驱动中
                   PreparedStatement ptmt = conn.prepareStatement(sql);
                   ptmt.setString(1,username);
                   ptmt.setString(2,password);
                   ResultSet rs = ptmt.executeQuery();
    

    DriverManager

    不用Class.forName()获取JDBC驱动,直接根据数据库厂商提供的META-INF/services/ 文件,利用SPI机制进行驱动加载。

    参照:mysql-connector-java-8.0.15.jar

    1、首先DriverManager 需要加载 静态代码块中的loadInitialDrivers()方法进行初始化


    image.png

    2、SPI机制的实现,ServiceLoader是java的SPI机制的实现,通过ServiceLoader.load()方法会加载所有在META-INF/services/文件夹下的Driver文件,找到Driver接口的扩展实现类


    image.png
    image.png image.png image.png

    找到接口扩展实现类后,ClassLoader加载扩展实现类,在静态代码块中进行数据库驱动注册


    image.png

    相关文章

      网友评论

          本文标题:Java中的SPI机制

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