网站首页 > 技术文章 正文
一、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完成。
本文就到这里结束了,欢迎各位大佬留言讨论!
猜你喜欢
- 2024-12-18 Java开发中MongoDB数据库相关操作
- 2024-12-18 HashMap有几种遍历方法?推荐使用哪种?
- 2024-12-18 在RedisTemplate中使用scan代替keys指令
- 2024-12-18 MQ的发布订阅模式(fanout) mq几种消息模式
- 2024-12-18 Mybatis参数-ParameterMapping处理参数
- 2024-12-18 既然有MySQL了,为什么还要有MongoDB?
- 2024-12-18 Java遍历一个 List 有哪些方式?每种的实现原理以及哪种最高效?
- 2024-12-18 为什么很多人不愿意用hibernate了?
- 2024-12-18 Qt中 QMap 类、QHash 类、QVector 类详解
- 2024-12-18 半小时搞懂 IO 模型 io模型详解
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)