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下面,所以他是由根加载器加载的,而驱动类一般不会放到这个目录下面,所以一般根加载器是加载不到的。不得以,他就指定线程上下文加载器(自己的子类加载器)去加载了。就是这么简单的原因,但是这么做打破了自己定下的双亲委托的规范。