使用Class.forName()
加載JDBC驅動程序,而不是提供一些靜態方法來執行相同操作的驅動程序的邏輯是什麼?爲什麼JDBC驅動程序在類的靜態初始化程序中註冊自己?
例如,爲什麼不調用SomeDriverClass.loadDriver();
並繼續正常連接?致電java.sql.DriverManager.registerDriver()
的任何理由都不會以這種方式發生?
使用Class.forName()
加載JDBC驅動程序,而不是提供一些靜態方法來執行相同操作的驅動程序的邏輯是什麼?爲什麼JDBC驅動程序在類的靜態初始化程序中註冊自己?
例如,爲什麼不調用SomeDriverClass.loadDriver();
並繼續正常連接?致電java.sql.DriverManager.registerDriver()
的任何理由都不會以這種方式發生?
這樣,代碼在編譯期間不需要在類路徑中具有驅動程序類。您不希望在編譯時類路徑中擁有無數不同的JDBC過去,現在和將來的JDBC驅動程序,以使您的JDBC代碼與所有這些數據庫兼容。每次升級/更換驅動程序或數據庫時,您都不想重新編譯代碼。您只需要在String
中的驅動程序類名稱,該名稱可以在外部進行配置(通常爲屬性或xml文件)。
換句話說:可移植性和可重用性。
如果是爲了您自己的私人使用,做任何你想要的。但是,如果你在一個要公開發布的庫(例如ORM或某種數據庫管理工具)中使用它,它將不會變得流行,因爲最終用戶必須獲取源代碼並在每次更改/重新編譯它時不支持他們的數據庫。
這是服務提供者框架的一部分。靜態工廠方法返回的對象的類在包含方法的類寫入時不需要存在。這允許在運行時插入多個實現的佔位符。
服務提供者框架是一個系統,其中多個服務提供者實現一個服務,並且系統使這些實現對其客戶端可用,從而將它們從實現中解耦。
如果它的somedriver.loadDriver()那麼實現是緊密耦合的。
接口解決了這個問題,所以不用聲明一個具體的類,而是執行類似databaseDriver.load()的操作,並使用IOC來注入驅動程序實現。 示例IDatabaseDriver driver = IOCContainer.getDriver(); driver.load(); – 2014-02-24 20:26:39