JavaSE-24.3【模块化(JDK9及之后)、Window环境不同版本JDK本地共存】

 

 

 

 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 }

 20210621记

 

posted @ 2021-06-20 22:29  yub4by  阅读(82)  评论(0编辑  收藏  举报