Java复习15-模块化

1.模块化概述

Java语言随着这些年的发展已经称为了一门印象深远的编程语言,无数平台、系统都采用Java语言编写,但是伴随着发展,Java也越来越大,逐渐发展成为一门“臃肿”的语言。而且,无论是运行一个大型的软件系统,还是运行一个小程序,即使程序只需要使用Java的部分核心功能,JVM也要加载整个JRE环境。

为了给Java“瘦身”,让Java实现轻量化,Java9正式的推出了模块化系统。Java被拆分为N多个模块,并允许Java程序可以根据需要选择加载程序必须家待Java模块,这样就可以让Java以轻量化的方式来运行。

其实,Java7的时候已经提出了模块化的概念,但由于其过于复杂,Java7,Java8都一直都未能推出,直到Java9才真正成熟起来。对于Java语言来说,模块化系统是一次真正的自我革新,这种革新使得“古老而庞大”的Java语言重新焕发年轻的活力。

2.模块的基本使用

模块的基本使用步骤

  • 创建模块(按照以前的讲解方式创建模块、包、类、定义方法)

    ​ 为了体现模块的使用,我们创建2个模块,一个是one,一个是myTwo

    ​ File->ProjectSettings->Modules->±>New Modules->Next->输入模块名回车创建

  • 在模块的src目录下新建一个名为module-info.java的描述性文件,该文件专门定义模块名、访问权限、模块依赖等信息

    ​ 描述性文件中使用模块导出和模块依赖来进行配置并使用

  • 模块中所有未导出的包都是模块私有的,他们是不能在模块之外被访问的

    ​ 在myOne这个模块下的描述性文件中配置模块带出

    ​ 模块导出格式:exports 包名;

  • 一个模块要访问其他的模块,必须明确指定依赖哪些模块,未明确指定依赖的模块不能访问

    ​ 在myTwo这个模块下的描述性文件中配置模块依赖

    ​ 依赖格式:requires 模块名;

    ​ 注意:若写模块名报错,需要按下Alter+Enter提示,然后选择模块依赖

  • 完成这些后,在myTwo这个模块的类中使用依赖模块下的内容

在被访问模块中的src下建立module-info.java文件,其中将该模块内被访问的包导出,然后再访问模块中的src下建立module-info.java文件,并在该文件中指定要依赖的模块,如此该模块就可以使用依赖模块包下的内容

模块服务的使用

服务:从Java6开始,Java提供了一种服务机制,允许服务提供者和服务使用者之间完成解耦。简单的说,就是服务使用者只面向接口编程,但不清楚服务提供者的实现类。

Java9的模块化系统则进一步的简化了Java的服务机制。Java9允许将服务接口定义在一个模块中,并使用uses语句来声明该服务接口,然后对该服务接口提供不同的服务实现类,这些服务实现类可以分布在不同的模块中,服务实现模块则使用provides语句为服务接口指定实现类

服务使用者只需要面向接口编程即可

模块服务的使用步骤

  • 在myOne模块下创建一个包itheima03,在该包下提供一个接口,接口中定义一个抽象方法

    public interface MyService{

    ​ void service();

    }

  • 在itheima03包下创建一个包impl,在该包下提供接口的两个实现类Itheima和Czxy

  • 在myOne这份模块下的描述性文件中添加如下配置

    ​ 模块导出:exports itheime03;

    ​ 服务提供:provides MyService with itheima; 指定MyService的服务实现类是ithiema

  • 在myTwo这个模块下的描述性文件中添加如下配置

    ​ 声明服务接口:uses MyService;

  • 在myTwo这个模块的类中使用MyService接口提供的服务

    ​ ServiceLoader:一种加载服务实现的工具

/*
    myOne\src\itheima03\impl\ithiema.java
 */

package itheima03.impl;

import itheima03.MyService;

public class itheima implements MyService {
    @Override
    public void service(){
        System.out.println("xueitlaiheima");
    }
}
/*
    myOne\src\itheima03\impl\czxy.java
 */
package itheima03.impl;

import itheima03.MyService;

public class czxy implements MyService {
    @Override
    public void service() {
        System.out.println("chuanzhixueyuan");
    }
}
/*
    myOne\src\itheima03\MyService.java
 */
package itheima03;

public interface MyService {
    void service();
}
/*
    myOne\src\module-info.java
 */
import itheima03.MyService;

module myOne {
    exports itheima01;
    exports itheima03;

//    provides MyService with itheima03.impl.itheima;

    provides MyService with itheima03.impl.czxy;
}
/*
    myTwo\src\itcast\Test02.java
 */
package itcast;

import itheima03.MyService;

import java.util.ServiceLoader;

public class Test02 {
    public static void main(String[] args) {
        //加载服务
        ServiceLoader<MyService> myServices = ServiceLoader.load(MyService.class);

        //遍历服务
        for (MyService my:myServices){
            my.service();
        }
    }
}
/*
    myTwo\src\module-info.java
 */
import itheima03.MyService;

module myTwo {
    requires myOne;

    uses MyService;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值