JavaSE-24.3【模組化(JDK9及之後)】
阿新 • • 發佈:2021-06-21
1 package day15.lesson3; 2 3 /* 4 3 模組化 5 6 3.1 模組化概述 7 8 Java語言隨著這些年的發展已經成為了一門影響深遠的程式語言,無數平臺,系統都採用Java語言編寫。 9 但是,伴隨著發展,Java也越來越龐大,逐漸發展成為一門“臃腫” 的語言。 10 而且,無論是執行一個大型的軟體系統,還是執行一個小的程式,即使程式只需要使用Java的部分核心功能, JVM也要載入整個JRE環境。 11 為了給Java“瘦身”,讓Java實現輕量化,Java 9正式的推出了模組化系統。 12 Java被拆分為N多個模組,並允許Java程式可以根據需要選擇載入程式必須的Java模組,這樣就可以讓Java以輕量化的方式來執行。13 其實,Java 7的時候已經提出了模組化的概念,但由於其過於複雜,Java 7,Java 8都一直未能真正推出,直到Java9才真正成熟起來。 14 對於Java語言來說,模組化系統是一次真正的自我革新,這種革新使得“古老而龐大”的Java語言重新煥發年輕的活力 15 16 圖 17 18 PS:目前本地為JDK8環境,以下操作還實現不了QAQ 19 20 3.2 模組的基本使用 21 22 1. 在專案中建立兩個模組。一個是myOne,一個是myTwo 23 File-->new-->Module 24 或25 File-->Project turcture-->+add-->new Module 26 27 2. 在myOne模組中建立以下包和以下類,並在類中新增方法 28 com.yppah_01包 29 Student類 30 study() 31 com.yppah_02包 32 Teacher類 33 teach() 34 35 3. 在myTwo模組中建立以下包和以下類,並在類中建立物件並使用36 cn.yppah包 37 Test01類 38 main() 39 40 4. 在myOne模組中src目錄下,建立module-info.java描述性檔案 41 右鍵src-->new-->module-info.java 42 (1)module-info.java 43 該檔案專門定義模組名、訪問許可權、模組依賴等資訊 44 描述性檔案中使用模組匯出和模組依賴來進行配置使用 45 (2)模組中所有未匯出的包都是模組私有的,不能在模組之外被訪問 46 在myOne模組的描述性檔案中配置模組匯出 47 格式: 48 exports 包名 49 50 5. 在myTwo模組中src目錄下,建立module-info.java 51 一個模組要訪問其他模組,必須明確指定依賴哪些模組,未明確指定依賴的模組不能訪問 52 在myTwo模組的描述性檔案中配置模組依賴 53 格式: 54 requires 模組名 55 注意:寫模組名會報錯,需要按alt+enter提示,然後選擇模組依賴 56 完成上述後,即可再myTwo模組下的類中使用依賴模組下的內容了 57 58 3.3 模組服務的基本使用 59 myOne模組 60 src 61 com.yppah_03包 62 MyService介面 63 service()抽象方法宣告 64 impl包 65 MyServiceImpl1類 實現MyService 66 重寫實現service() 67 MyServiceImpl2類 實現MyService 68 重寫實現service() 69 描述檔案module-info.java 70 模組匯出:exports com.yppah_03; 71 服務提供:provides MyService with MyServiceImpl1; <--指定MyService的服務實現類是MyServiceImpl1 72 73 myTwo模組 74 描述檔案module-info.java 75 宣告服務介面:uses MyService; 76 src 77 cn.yppah包 78 Test02類 79 main() 使用MyService介面 80 在myTwo模組的類中使用MyService介面提供的服務 81 ServiceLoader類:一種載入服務實現的工具 82 */ 83 public class Demo1Module { 84 public static void main(String[] args) { 85 System.out.println("javase 完結撒花 沖沖衝"); 86 } 87 }
myOne模組(~甲方)
package com.yppah_01; public class Student { public void study(){ System.out.println("好好學習天天向上"); } }
package com.yppah_02; public class Teacher { public void teach(){ System.out.println("好好教書"); } }
package com.yppah_03; public interface MyService { void service(); }
package com.yppah_03.impl; import com.yppah_03.MyService; public class MyServiceImpl1 implements MyService { @Override public void service() { System.out.println("好好學java"); } }
package com.yppah_03.impl; import com.yppah_03.MyService; public class MyServiceImpl2 implements MyService { @Override public void service() { System.out.println("go go go"); } }
1 import com.yppah_03.MyService; 2 import com.yppah_03.impl.MyServiceImpl1; 3 import com.yppah_03.impl.MyServiceImpl2; 4 5 module myOne { 6 exports com.yppah_01; 7 8 exports com.yppah_03; 9 // provides MyService with MyServiceImpl1; 10 provides MyService with MyServiceImpl2; //服務提供者:修改服務實現類,myTwo模組下的使用者不知情 11 }
myTwo模組(~乙方)
package cn.yppah; //import com.yppah_01.Student; //編譯異常 //import com.yppah_02.Teacher; //編譯異常 //正常來講,這屬於跨模組訪問,無法訪問 //JDK9之後,在配置描述性檔案後,可以實現 <----jdk9新特性之模組化 public class Test01 { public static void main(String[] args) { // Student s = new Student(); // s.study(); // Teacher t = new Teacher(); // t.teach(); } }
package cn.yppah; import com.yppah_03.MyService; import java.util.ServiceLoader; public class Test02 { public static void main(String[] args) { //載入服務 ServiceLoader<MyService> sl = ServiceLoader.load(MyService.class); //遍歷服務 for (MyService ms: sl){ ms.service(); } } }
1 import com.yppah_03.MyService; 2 3 module myTwo { 4 requires myOne; //依賴模組首次配置會報錯,按alt+回車,自動新增依賴 5 6 uses MyService; //服務使用者:只需要面向介面程式設計 7 }