將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程式碼本身沒有變化。
相關文章
- Java 9 的模組(Module)系統Java
- Java 9 平臺模組系統初探Java
- 將spfile從ASM裡遷移到檔案系統ASM
- 將 CentOS 8 作業系統遷移到 Oracle LinuxCentOS作業系統OracleLinux
- 掌握Java9模組化系統-進階部分Java
- 掌握Java9模組化系統-基礎部分Java
- 如何將物理機Windows系統遷移到VMware虛擬機器?Windows虛擬機
- 將nodejs遷移到D盤NodeJS
- 如何將 CentOS遷移到 AlmaLinux?CentOSLinux
- Python 將所有 Bug 遷移到 GitHub 中PythonGithub
- JAVA oa 系統模組設計方案Java
- win10遷移系統到固態硬碟 win10系統遷移到ssd教程Win10硬碟
- 使用SpringCloud將單體遷移到微服務SpringGCCloud微服務
- 將 flutter_web 遷移到 flutter1.9+FlutterWeb
- 我如何將部落格遷移到 Kubernetes(上)
- 我如何將部落格遷移到 Kubernetes(下)
- 將maven、gradle倉庫遷移到d盤MavenGradle
- [譯] 將專案遷移到 Yarn 然後又遷回 npmYarnNPM
- Java模組系統JPMS是巨坑?- jodastephenJavaAST
- java 考試系統 模組架構方案Java架構
- JAVA 考試系統模組設計方案Java
- 將ZooKeeper遷移到Kubernetes的新方法 - hubspot
- 透過MySQL Workbench 將 SQL Server 遷移到GreatSQLMySqlServer
- 如何將您的 Eventlet 專案遷移到 Asyncio
- 【Java】ServiceLoader原始碼分析Java原始碼
- Spring Boot 從1.5遷移到2.0.5 - DZone JavaSpring BootJava
- 案例:微服務從Java/SpringBoot遷移到Golang微服務JavaSpring BootGolang
- JAVA oa 辦公系統模組 設計方案Java
- java OA 辦公系統 模組設計方案Java
- Flutter #03 將原有的 Flutter app 遷移到 Flutter 2.0FlutterAPP
- svn 遷移到gitGit
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- ABP之模組系統
- JS模組化系統JS
- Flutter 將您的外掛遷移到新的Android APIFlutterAndroidAPI
- 將SpringBoot PetClinic REST遷移到Quarkus的開源專案Spring BootREST
- 重構案例:將純HTML/JS專案遷移到WebpackHTMLJSWeb
- Spotify如何從Apache kafka遷移到雲平臺的pub/sub系統ApacheKafka