service provider frameworks - 服務提供者框架: 多個服務提供者實現一個服務,系統為服務提供者的客戶端提供多個實現,並把他們從多個實現中解耦出來。
SPF 包括以下組件:
組件 | 說明 |
---|---|
服務接口(Service Interface ) | 這是提供者實現的 |
提供者注冊API(Provider Registration API) | 這是系統用來注冊實現,讓客戶端訪問 |
服務訪問API(Service Access API) | 是客戶端用來獲取服務的實例的 服務訪問API一般允許但是不要求客戶端指定某種選擇提供者的條件,如果沒有這樣的規定,API就會返回默認實現的一個實例 服務訪問API是“靈活的靜態工廠”,它構成了SPF的基礎 |
服務提供者接口(Service Provider Interface) | 負責創建其服務實現的實例 |
示例: SPFTest
通過上面的例子可以看出,我們只需要輸入一個key就可以得到對應的類的實例,進而使用該類的方法,這種方法能大大降低代碼的耦合度,這里的Map集合可以理解為服務提供者框架的注冊機制,Map中的Key和Value的值都應該在配置的屬性文件(properties)中,這樣方便我們查看和添加服務類,我們只需要操作這個配置文件就可以了,這樣我們的實際模式實現了java的解耦合問題。
服務接口的具體實現類和服務提供者接口的實現類都是服務提供者自己去實現。以JDBC為例,這2個模塊由具體的數據庫提供商來實現。
示例:JDBC(Java數據庫連接,Java Database Connectivity)
加載驅動程序:
1 Class.forName(driverClass); 2 //加載MySql驅動 3 Class.forName("com.mysql.jdbc.Driver"); 4 //加載Oracle驅動 5 Class.forName("oracle.jdbc.driver.OracleDriver");
獲得數據庫連接:
1 DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/fireway", "root", "root");
創建Statement/PreparedStatement對象:
1 conn.createStatement(); 2 conn.prepareStatement(sql);
下面我們看看上面的語句分別做了什么事情:
- Connection就是JDBC的服務接口;
Class.forName("...")
會實例化一個com.mysql.jdbc.Driver類(服務提供者接口的實現類),並將這個類的實例注冊到DriverManager.registerDriver(提供者注冊API);- 通過建立連接的URL,用戶名,密碼來獲取鏈接到mysql數據庫的Connection服務。DriverManager.getConnection()是服務訪問API, 返回的是具體的實現類對象。
- Driver就是服務提供者接口。
參考資料: