Java中的SPI机制

2021-02-02  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读