Java中的SPI机制

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容