优秀的编程知识分享平台

网站首页 > 技术文章 正文

深入理解SPI机制 spi 机制

nanyue 2024-12-18 16:03:02 技术文章 5 ℃

一、SPI含义

Service Provider Interface是一种发现机制的服务。它通过自身,可以加载那些在文件里面被所定义的所有类。

先举一个很简单的例子:

1、举例

定义一个SPIService接口

然后,定义两个实现类:

最后在ClassPath路径下配置文件。

名字是接口的全限定类名,内容则是实现类的全限定类名,之间别忘记用换行符。


2、测试

输出结果一致:

二、源码

1、ServiceLoader

ServiceLoader的类结构:

2、Load

load方法创建属性,实例化了内部类LazyIterator。最后返回ServiceLoader:

3、查找、实现类

在LazyIterator完成查找实现类和创建实现类的过程:

lookupIterator.hasNext()方法最终会调用到hasNextService:

4、实例

lookupIterator.nextService通过反射,创建实现类的实例:

三、应用JDBC

再来看一下JDBC获取数据库连接的过程。以前的老版本里面,我们得设置数据库驱动的连接,然后才能获取一个Connection。

1、载入

DriverManager类在静态代码块里,通过SPI机制,初始化了数据库的驱动连接。

loadInitialDrivers查找的是Driver接口的服务类。

我们来看MySQL的jar包,就是这个文件,文件内容为:com.mysql.cj.jdbc.Driver

2、实例

上一步已经找到了MySQL中的com.mysql.cj.jdbc.Driver全限定类名,当调用next方法时,就会创建这个类的实例。它就完成了一件事,向DriverManager注册自身的实例。

3、创建Connection

DriverManager.getConnection()方法就是创建连接的地方,它通过循环已注册的数据库驱动程序,调用其connect方法,获取连接并返回。

4、再扩展

先在项目ClassPath下创建文件,文件内容为自定义驱动类com.viewscenes.netsupervisor.spi.MyDriver,如图:

通过调用connect方法调用到此类,但实际创建的过程还得靠MySQL完成。

本文就到这里结束了,欢迎各位大佬留言讨论!

Tags:

最近发表
标签列表