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