在看jdbc时,书上说java6支持驱动程序自动加载,也就是不用Class.forName显示加载,请问是如何实现的,朋友们请看清问题回答
用 WinRAR 或 WinZip 打开 那个 JDBC 4.0+ 的驱动程序,(早期版本的驱动程序是不支持的),你可以看到 META-INF 文件夹下面多出了一个文件,它里面写着驱动程序的名字。JDBC DriverManager 会自动搜索 META-INF/xxxxx 去尝试读取它找到的任何 jar 中的这个目录,如果有东西就会自动 Class.forName 加载它,这在 Java 中叫 Service Provider discovery 机制,自动发现,JSP 中的 tld 文件也是使用类似的机制,以前需要我们手工把它们配置在 web.xml 里面,后来不需要了,你可以找一个 jstl.jar 打开来看看,设计原理是一样的。以后你可以模仿一样,在 META-INF 中添加一个东西来当然插件机制。扫描 META-INF 也可能由 JVM 自动来完成并添加它到 System.getProperties() 里面。
如图:
追问就是是它里面帮我们加载了?
追答首先,这个 META-INF/services (猜想,不一定是,也可能是 META-INF/drivers,因为我手上没有 JDBC 4.0+ 的驱动包) 已经由 JVM 帮我们扫描过并添加到 System.setProperties("jdbc.drivers", System.getProperties("jdbc.drivers") + ';' + $扫描到的drivers); 这样把所有可用的 jdbc.drivers 拼接起来用分号隔开,以后 DriverManager 就会从 System.getProperties("jdbc.drivers"); 中读取并全部加载它们。
你需要做的是通过观察找出线索。
那个service文件是在驱动里面,drivermanager怎么知道有这个文件
?
追答JRE 可能自动搜索 jar 中的 META-INF 目录,也可能是 DriverManager 自动搜索。
你写个 main class 尝试搜索 new Jar("a.jar") 然后读取它的 manifest,这个 manifest 是 Java 的规范格式,所以可能 java 或 classloder 可以自动处理它们。
为什么?
追答为什么,我也不知道,这是JVM底层的实现,感兴趣的话你可以去比较源码。