通过JDBC驱动加载深刻理解线程上下文类加载器机制

关于线程上下文类加载器已经在之前学得比较透了,作为一个收尾,这里用平常J2EE开发时JDBC连接Mysql数据库常见的一段代码通过分析它的底层进一步加深对线程上下文类加载器的理解,所以先来将连接应用代码写上,注意:这里不力求真正的去完成数据的连接,重在在分代码,如下:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

说实话如今的工作重点是搞android的开发,再来看上面的这段代码还是非常之亲切的,当然啦搞J2EE开发的那就不用多说了,家常便饭了,好,接下来先来分析第一行代码:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

对于mysql驱动有两个:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

而我们使用的是第一个,对于forName方法目前我们也比较清楚它的作用了,看一下它的源码:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

既然会初始化"com.mysql.jdbc.Driver",那就跟到这个类里面,看在初始化的时候干了啥:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

对于类的初始化是位置类加载的第三个阶段,这里再来回忆一下其整个过程:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

而类的初始化会导至类的static代码【静太代码块,静态变量】得到执行,所以:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

所以此时会调用DriverManager.registerDriver()方法,但是在调用方法之前肯定也得初始化DriverManager嘛,所以跟进去:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

是不是如咱们分析的这样的呢,咱们可以debug看一下,先打上断点:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

嗯~~完全正确!继续分析:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

跟进去:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

这是加载JDBC的另外一种方式,咱们可以打印一下该系统属性:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

接着往下执行:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

所以最终会用这种方式去加载驱动,所以这个方法就是去执行了驱动的加载工作,流程再回到上一层:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

注册驱动里面是如何做的呢?

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

接着回到主流程的第二句代码:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

细心的话可以发现,这句话完全木有Mysql的API居然最后就可以生成Mysql的一个连接,这底层是怎么做到的呢?继续跟踪,先简单看一下getConnection的javadoc:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

接着看它的具体代码实现:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

这里可以打一个段点看一下第三个参数是否如所料:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

嗯~~完成正确~~继续往下分析:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

继续打断点确认一下是否如预料:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

咱们debug看一下此时registeredDrivers的值是多少:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

呃~~为啥有两个呢,咱们第一句代码不只是指定了一个么,如下:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

这是因为如今的mysql版本会自动在这个目录进行寻找并注册驱动:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

所以这里需要注意,继续往下:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

好,这个细节非常重要,定位到它看一下:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

想想为啥呢?命名空间!!!!可能这块已经都忘得差不多了,因为不同的类加载器所加载的相同的类是不相等的,如之前【https://www.cnblogs.com/webor2006/p/9157847.html】我们做实验所示:
通过JDBC驱动加载深刻理解线程上下文类加载器机制

通过JDBC驱动加载深刻理解线程上下文类加载器机制

回到咱们这个场景,由于是SPI的场景,用户可以随意去设置线程上下文类加载器,所以就有可能出现不等的情况,这也是为啥要做一个判断的原因之所在,继续往下分析:

通过JDBC驱动加载深刻理解线程上下文类加载器机制

至此整个JDBC的创建连接的过程就已经分析完了,而类加载器这块的所有知识都已经学完啦,相当之不易,想当初对于类的双亲委托机制只知道概念,每次面试官问到这个时也仅能回到出理论部分,经过这么细致的学习我想不管未来的面试还是工作当中遇到类加载相关的问题应该是so easy的事啦!

上一篇:ecshop不同文章分类调用不同文章分类模板


下一篇:ecshop调用指定分类和个数的文章列表