將ServiceLoader遷移到Java 9模組系統 - frankel
Service Loader允許在不同的JAR中分離API及其實現。客戶端程式碼僅取決於API,而在執行時,將使用類路徑上的實現。這是將客戶端程式碼與實現程式碼分離的好方法。
為了說明這一點,讓我們實現自己的日誌記錄專案:
public interface LogService { void log(String message); } public class LogStdOut implements LogService { @Override public void log(String message) { System.out.println(message); } } |
呼叫API並利用服務載入程式機制的客戶端:
public class Client { public static void main(String[] args) { ServiceLoader<LogService> loader = ServiceLoader.load(LogService.class); for (LogService service : loader) { service.log("Log written by " + service.getClass()); } } } |
之所以如此神奇,是因為客戶端包含一個滿足一些約束的服務載入器配置檔案:
- 它位於 /META-INF/services
- 它的名稱是介面的標準名稱
- 它包含實現類的標準類名:/META-INF/services/ch.frankel.blog.serviceloader.log.LogServicech.frankel.blog.serviceloader.log.stdout.LogStdOut
遷移到Java平臺模組系統
關於我們的示例專案,需要執行以下步驟。
1.模組化API: 為了使其他模組(實現和客戶端)使用API,LogService需要匯出包含介面的包。
module-info.java
module log.api { exports ch.frankel.blog.serviceloader.log; } |
2.模組化客戶端: 客戶端位於模組依賴關係樹的邊界。它只需要API模組。
module-info.java
module log.client { requires log.api; } |
3. 模組化實施: 實現需要API。它還應該匯出包含實現的包,以便可以在其他模組中使用。但是,這還不夠。Java 9取代了Service Loader的工作方式,從META-INF/services資料夾到特定於模組的實現。
為此,module-info語法提供了兩個關鍵字:使用provides引用介面並使用with指定實現:
module-info.java
import ch.frankel.blog.serviceloader.log.LogService; import ch.frankel.blog.serviceloader.log.stdout.LogStdOut; module log.stdout { requires log.api; exports ch.frankel.blog.serviceloader.log.stdout; provides LogService with LogStdOut; } |
有趣的是,僅配置發生了變化:客戶端中的Service Loader程式碼本身沒有變化。
相關文章
- 使用RAM將檔案系統遷移到ASMASM
- 將spfile從ASM裡遷移到檔案系統ASM
- 將 CentOS 8 作業系統遷移到 Oracle LinuxCentOS作業系統OracleLinux
- 將資料庫從ASM遷移到檔案系統資料庫ASM
- 將資料庫從檔案系統遷移到ASM資料庫ASM
- Java 9 的模組(Module)系統Java
- Java 9 平臺模組系統初探Java
- 如何將物理機Windows系統遷移到VMware虛擬機器?Windows虛擬機
- 利用RMAN將資料庫從檔案系統遷移到ASM資料庫ASM
- (原)將Oracle遷移到SQLServerOracleSQLServer
- oracle將控制檔案從裸裝置遷移到檔案系統Oracle
- 從檔案系統遷移到ASM上ASM
- oralce 從檔案系統遷移到ASMASM
- 如何將 CentOS遷移到 AlmaLinux?CentOSLinux
- 將表 從mysql 遷移到oracleMySqlOracle
- 將nodejs遷移到D盤NodeJS
- 利用RMAN將資料庫從檔案系統遷移到ASM(單例項)資料庫ASM單例
- 資料庫從檔案系統遷移到ASM資料庫ASM
- 掌握Java9模組化系統-基礎部分Java
- 掌握Java9模組化系統-進階部分Java
- win10遷移系統到固態硬碟 win10系統遷移到ssd教程Win10硬碟
- 將 flutter_web 遷移到 flutter1.9+FlutterWeb
- Python 將所有 Bug 遷移到 GitHub 中PythonGithub
- 將EJB 3應用程式遷移到GlassFish
- PayPal從Java遷移到Node.jsJavaNode.js
- [譯] 將專案遷移到 Yarn 然後又遷回 npmYarnNPM
- 使用SpringCloud將單體遷移到微服務SpringGCCloud微服務
- [譯] 將現有的 API 從 REST 遷移到 GraphQLAPIREST
- 將我的部落格遷移到亞馬遜雲端(1)亞馬遜
- 將我的部落格遷移到亞馬遜雲端(2)亞馬遜
- 將應用程式從Sql Server遷移到OracleSQLServerOracle
- 透過MySQL Workbench 將 SQL Server 遷移到GreatSQLMySqlServer
- 將maven、gradle倉庫遷移到d盤MavenGradle
- 採用Duplicate不連線target資料庫的方式將檔案系統遷移到ASM資料庫ASM
- 【Java】ServiceLoader原始碼分析Java原始碼
- 遷移到ASMASM
- oracle 將表空間下的資料檔案從檔案系統遷移到ASM磁碟組OracleASM
- 我如何將部落格遷移到 Kubernetes(上)