摘要:模塊系統的前身是項目。最初,該項目僅僅是為設計實現一個模塊系統。隨著項目的不斷深入,平臺對標準模塊系統的呼求也日益增長,批準該項目升級為平臺的一部分,也能服務于和平臺的需求。自定義的配置,僅包含一組指定的模塊及其所需的模塊。
我的博客 轉載請注明原創出處。序
從Java 9開始,在Java的世界里多了一個叫模塊(JSR376)的特性。模塊系統的前身是Jigsaw項目。最初,該項目僅僅是為JDK設計、實現一個模塊系統。后來項目組也希望它能為開發者所用——雖然,一開始它并不是Java SE平臺規范的組成部分。隨著項目的不斷深入,Java平臺對標準模塊系統的呼求也日益增長,JCP批準該項目升級為JavaSE平臺的一部分,也能服務于Java ME和Java EE平臺的需求。
官方對Java平臺模塊系統是這樣描述的: 一種新的Java編程組件,即模塊。它是自描述的代碼與數據的集合,有以下特性:引入了一個新的可選階段——鏈接時,它介于編譯時和運行時之間,在此期間可以將一組模塊組裝并優化為定制的運行時鏡像。
為工具javac、jlink增加了一些選項,以及在Java中,你可以指定模塊路徑,這些路徑定位模塊的定義。
引入模塊化JAR文件,該文件是一個JAR文件,其根目錄中包含module-info.class文件。
引入JMOD格式,它是一種類似于JAR的打包格式,但它可以包含原生代碼和配置文件。
JDK本身已經模塊化。有以下改變:
使你能夠將JDK的模塊組合成各種配置,包括:
與JRE和JDK一樣的配置。
與Java SE 8中定義的每個壓縮配置文件的內容大致相同。
自定義的配置,僅包含一組指定的模塊及其所需的模塊。
重構JDK和JRE運行時鏡像以適應模塊并提高性能、安全性和可維護性。
定義了一個新的URI方案,用于命名存儲在運行時映像中的模塊,類和資源,而不會泄露映像的內部結構或格式。
刪除認可的標準覆蓋機制和擴展機制。
從Java運行時鏡像中刪除rt.jar和tools.jar。
默認情況下,大多數JDK的內部API都不可訪問,但在所有或大部分功能都支持替換之前,可以訪問一些關鍵的、廣泛使用的內部API。
運行jdeps -jdkinternals命令以確定你的的代碼是否使用了內部JDK API。
兼容性先來說說模塊系統的兼容性。Java一直是比較保守的,體現在更新上就是良好的兼容性。雖然看了官方對Java平臺模塊系統的描述好像改動非常大,但是你的舊項目即使不模塊化也是能在新JDK上運行的。后面會講到沒有模塊化的類包是如何與模塊交互的。
為什么要模塊化既然不模塊化也能好好的運行,那么為什么要這么大費周章的折騰代碼呢?
第一點,Java 9前的Java程序,即使是一個簡單的輸出Hello World的程序,也必須將整個JDK、JRE運行時鏡像打包進去才能運行,這時Java引以為傲的數量繁多的類庫反而成了累贅。比如開源的優秀編程庫——Guava里有很多很實用的工具類,有時我們可能只用到了其中一個類而已,卻不得不將整個Guava類庫打包進我們的項目。
第二點,沒法定義類是否能被其他包里的類引用到。比如我們編寫了一個工具類,如果希望這個類只能被某些包里的其他類引用到,不暴露給其他包,Java 9前的Java程序是做不到這一點的。
如何模塊化模塊化一個項目只要在項目的根目錄創建一個module-info.class文件就可以了。
如圖所示,我們創建了一個名為module的模塊并用關鍵字exports導出了test包。如果有其他模塊導入module模塊就可以引用到Main類了,值得注意的是和test同級的包和test內部的包因為沒有被導出,都是不能被引用到的。
而引用一個模塊則是用關鍵字requires:
然后就可以使用test包內的類了:
import test.Main; /** * @author Yuicon */ public class Test { public static void main(String[] args) { Main main = new Main(); System.out.println(main); } }
不過在導入前還需要在模塊依賴里添加要導入的模塊:
java.base模塊是默認導入的,里面有我們常用的類庫:
模塊的強封裝性我們知道模塊化后就能控制那些包可以被引用到了。不過不止如此,一個模塊的類是不能訪問到其他模塊里的類的私有屬性的。聽起來好像是理所當然的,這是因為原先我們是可以用反射來訪問到私有屬性的。模塊化后就算反射也不能訪問到了,算是加強了安全性。
不過這樣的話,那些依賴反射來獲取私有屬性的框架和庫就倒霉了。為了兼容這些框架和庫,我們可以在模塊定義里加一個關鍵字open:
module-info.class open module module { exports test; }
這樣我們就聲明了一個開放的模塊,在模塊的所有軟件包上授予深入的反射訪問權限(訪問公共和私有API)。
模塊語句在模塊聲明文件里一共有五種模塊語句,分別是:
導出語句(exports statement)
開放語句(opens statement)
需要語句(requires statement)
使用語句(uses statement)
提供語句(provides statement)
package test.driver; /** * @author Yuicon */ public interface Driver { int getCode(); }
package test; import test.driver.Driver; /** * @author Yuicon */ public class DriverImpl implements Driver { @Override public int getCode() { return 10086; } }
module module { exports test.driver; // 導出包 provides Driver with DriverImpl; // 為接口Driver提供實現 }
module queue { requires module; // 導入包 opens test; // 開放包的反射權限 uses Driver; // 聲明使用接口 }
package main; import test.driver.Driver; import java.util.ServiceLoader; /** * @author Yuicon */ public class Main { public static void main(String[] args) { // 獲取實現 ServiceLoader聚合模塊serviceLoader = ServiceLoader.load(Driver.class); serviceLoader.findFirst().ifPresent(driver -> System.out.println(driver.getCode())); } } 輸出: 10086 Process finished with exit code 0
你可以創建一個不包含任何代碼的模塊,它收集并重新導出其他模塊的內容,這樣的模塊稱為聚合模塊。假設有幾個模塊依賴于五個模塊,你可以為這五個模塊創建一個聚合模塊。現在,你的模塊只能依賴于一個模塊——聚合模塊。
為了方便,Java 9包含幾個聚合模塊,如java.se和java.se.ee。java.se模塊收集Java SE的不與Java EE重疊的部分。java.se.ee模塊收集組成Java SE的所有模塊,包括與Java EE重疊的模塊。
待續文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71719.html
摘要:本書概括以軟件系統為例,重點講解了應用架構中的物理設計問題,即如何將軟件系統拆分為模塊化系統。容器獨立模塊不依賴于具體容器,采用輕量級容器,如獨立部署模塊可獨立部署可用性模式發布接口暴露外部配置使用獨立的配置文件用于不同的上下文。 本文為讀書筆記,對書中內容進行重點概括,并將書中的模塊化結合微服務、Java9 Jigsaw談談理解。 本書概括 以Java軟件系統為例,重點講解了應用架構...
摘要:在設計模式中,所有的設計模式都遵循這一原則。其實就是說在應用程序中,所有的類如果使用或依賴于其他的類,則應該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎 一、面向對象思想設計原則 1.單一職責原則 其實就是開發人員經常說的高...
摘要:另一個用戶請求過來,負載均衡器指派這個請求到服務器。這樣就平攤了請求這種方式就叫做輪詢策略還有很多種,就看你想怎么實現了,反正這個邏輯的代碼放在負載均衡器上。 前言 只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 這本書買了一段時間了,之前在杭州沒帶過去,現在讀完第三章,來做做筆記 showI...
閱讀 2320·2021-09-29 09:42
閱讀 556·2021-09-06 15:02
閱讀 2595·2021-09-02 15:40
閱讀 2111·2019-08-30 14:23
閱讀 1860·2019-08-30 13:48
閱讀 1289·2019-08-26 12:01
閱讀 957·2019-08-26 11:53
閱讀 2141·2019-08-23 18:31