![748c164ab9e504e8ed087a0fd0b48b85.png](https://i-blog.csdnimg.cn/blog_migrate/cf18630469a9426fa21fcac0c7b1fa31.jpeg)
Java中的加载驱动的三种方法
一、使用Class.forName(“驱动类的全路径名”);
![52f5eb20a4362bad82da157521ac5e61.png](https://i-blog.csdnimg.cn/blog_migrate/041b322494d7d3c285393b11e3be3fcb.jpeg)
二、使用DriverManager.registerDriver()注册驱动
- 前提是先创建该驱动对象
![1834869b33a8512de0e7929e800bee99.png](https://i-blog.csdnimg.cn/blog_migrate/14d75f5551d7b2d07fcb238f221956ba.jpeg)
三、使用系统的配置文件,添加驱动类的全路径名
![5c2fa04d26e3a07fe539c5d89d67a75a.png](https://i-blog.csdnimg.cn/blog_migrate/e2bc55cfdfc4e95ad475b390a1fbdeac.jpeg)
首先想到的是:是不是已经在配置文件中设置了jdbc.drivers?
![d552f741bcc23d1399cc48b45029712f.png](https://i-blog.csdnimg.cn/blog_migrate/d59ab258d20f6b268651203ab7491613.jpeg)
经过查验,发现这三种方式都没有使用
解决
经过反复推理,抓住了其中关键:这三种方式加载驱动,最后都是通过DriverManager类实现的
DriverManager类
这个类是java中管理和注册驱动的类
探究DriverManager类中源码,终于解决问题
DriverManager中静态代码块
![df59d564374c3204c07e19f1e660186a.png](https://i-blog.csdnimg.cn/blog_migrate/a65a64d16dcaf04034c766debc5d3848.jpeg)
- loadInitialDrivers方法中找到第三加载驱动的方式
![448b9bf72c7bbbe2da53abc16b9ce808.png](https://i-blog.csdnimg.cn/blog_migrate/cc7f7d7a20b69f8e930844941cbfe1fb.jpeg)
- 同样在loadInitialDrivers中找到问题的最终的原因
![f85a08d106a990f2844d33f1d62f5fab.png](https://i-blog.csdnimg.cn/blog_migrate/ab5ec8bf56c2d9b8c3c501b0afad0439.jpeg)
- ServiceLoader类
![11e7240e4f00b13e48498b6a62c687de.png](https://i-blog.csdnimg.cn/blog_migrate/41cd47d2698a76e19e448e80517486c0.jpeg)
- LazyIterator中的部分源码(代码太多,有兴趣的读者可以自行查看JDK6以上的相关源码)
![330631c0ec1c2e2e7bdd1717a184298c.png](https://i-blog.csdnimg.cn/blog_migrate/cb3f0678702dd90c418ff06dea570334.jpeg)
- 最终会加载DriverManager管理下的META-INF/services/所有文件,都尝试加载
- 所以这种方式要驱动包有META-INF/services/下的包含驱动类路径的文件
最后,我自己是一名从事了多年开发的JAVA老程序员,辞职目前在做自己的java私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:java,即可免费获取。
作者:扣天辰
来源:掘金
![598b3f6e3c5c4b2b8da0b2b52c4841db.png](https://i-blog.csdnimg.cn/blog_migrate/5f2ad070f859e2d40ddaba331a422ae3.jpeg)