网站首页 > 技术文章 正文
一、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模型详解
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 511℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 487℃MySQL service启动脚本浅析(r12笔记第59天)
- 467℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 465℃启用MySQL查询缓存(mysql8.0查询缓存)
- 445℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 424℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 421℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)