jdbc驱动类加载直接指定线程上下文加载器加载

本文详细解析了JDBC中Class.forName加载MySQL驱动的过程,以及DriverManager.getConnection如何利用线程上下文加载器避免双亲委派。讨论了为何JDK不直接加载驱动及带来的规范挑战。
摘要由CSDN通过智能技术生成

 jdbc获取连接是这么写的,看下代码都干了什么,是如何把驱动类加载到jvm的。

Class.forName是装载一个类并且对其进行实例化的操作。这里mysql驱动com.sql.Driver的静态方法把该驱动类对象注册到DriverManager中了,就是添加到registeredDrivers列表中,后面会再遍历获取已注册的驱动类;

再看DriverManager.getConnection(conUrl, userName, password);这个是jdk自己的实现,可以看到是jre\lib\rt.jar中的类。 我们是没传caller参数的,jdk自己指定使用了线程上下文加载值进行加载,而没有遵守父类委托机制。

这里看到这里使用线程上下文加载器来加载驱动Driver实现类的的。

 我理解为什么jdk不直接加载驱动实现类, 首先com.java.sql包是在jre/lib/rt.jar下面,所以他是由根加载器加载的,而驱动类一般不会放到这个目录下面,所以一般根加载器是加载不到的。不得以,他就指定线程上下文加载器(自己的子类加载器)去加载了。就是这么简单的原因,但是这么做打破了自己定下的双亲委托的规范。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值