JDBC 是如何破坏双亲委派机制的?
我看了好多的博客,但是说的都很笼统。但是大致意思如下,
DriverManager 这个类 存在在 rt.jar里面由启动类加载器加载,而它里面需要用到外部引入的jar,比如说 mysql-connect.jar里面的Driver,于是DriverManager这个类不得不使用 Thread ContextClassLoader 去加载外部的具体实现.
(由这个星号标识的部分是我非常不理解的)
我仔细也试着去读代码,发现跟他们说的不一致.
我的疑问如下:
1.
Class.forName("com.mysql...");
这句话加载驱动,使用了那种类型的加载器,据我的理解应该是应用类加载器. 对吗?
2.
在mysql的Driver实现类中,使用static静态代码块,调用了DriverManager.registerDriver(new Driver()).
然后DriverManager中就持有了这个Driver,并没有发现.DriverManager 通过 ContextClassLoader去加载这个Driver的代码.
虽然DriverManager.getConnection()方法里面由一段这样的代码
synchronized(DriverManager.class) {
if (callerCL == null) {
callerCL = Thread.currentThread().getContextClassLoader();
}
}
但是它用的driver还是register的driver,并不是由callerCL加载的.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
上面使用
Class.forName
的方式注册驱动是比较古老的方式拉,新的DriverManager
中会通过SPI
机制自动加载驱动,只要classpath
中有相应的驱动包即可。在新的版本中,不需要显式的加载驱动,直接
DriverManager.getConnection
即可。新的
DriverManager
加载驱动的过程是在loadInitialDrivers
方法中进行的。上面的方法知识加载驱动类,具体的注册逻辑在
Driver
类中,可查看Driver
接口的说明: