使用JDBC時,我們都會很自然得使用下列語句:
為什么說很自然呢,因?yàn)闊o論是網(wǎng)上還是書本教程上得例子都是這樣的,而且程序也確實(shí)正常運(yùn)行了,于是大家也就心安理得的找葫蘆畫瓢下去了。
一定要有這一句嗎?不是的,我們完全可以用這樣一句代替它:
大家可能都看出個大概來了,我們只需要在調(diào)用DriverManager的getConnection方法之前,保證相應(yīng)的Driver類已經(jīng)被加載到j(luò)vm中,并且完成了類的初始化工作就行了,而具體是怎樣實(shí)現(xiàn)這個功能卻是沒有講究的。上面兩種方法都可以實(shí)現(xiàn)這個功能,因此程序可以正常運(yùn)行。注意了,如果我們進(jìn)行如下操作,程序是不能正常運(yùn)行的,因?yàn)檫@樣僅僅使Driver類被裝載到j(luò)vm中,卻沒有進(jìn)行相應(yīng)的初始化工作。
我們都知道JDBC是使用Bridge模式進(jìn)行設(shè)計的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一個具體實(shí)現(xiàn)(請參考GOF的Bridge模式的描述)。大家注意了,前一個Driver是一個接口,后者卻是一個類,它實(shí)現(xiàn)了前面的Driver接口。
Bridge模式中,Abstraction(DriverManager)是要擁有一個Implementor(Driver)的引用的,但是我們在使用過程中,并沒有將Driver對象注冊到DriverManager中去啊,這是怎么回事呢?jdk文檔對Driver的描述中有這么一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,原來是com.mysql.jdbc.Driver在裝載完后自動幫我們完成了這一步驟。源代碼是這樣的: