1. 程式人生 > 其它 >JavaSE-24.3【模組化(JDK9及之後)】

JavaSE-24.3【模組化(JDK9及之後)】

 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 }