1.模块的基本使用
,模块的基础使用步骤
-
创建模块(按照以前的讲解方式创建模块,创建包,创建类,定义方法)
- 为了体现模块的使用,创建两个模块:
myOne
和myTwo
- 为了体现模块的使用,创建两个模块:
-
在模块的
src
目录下新建一个名为module-info.java
的描述性文件,该文件专门定义模块名,访问权限,模块依赖等信息- 描述性文件中使用模块导出和模块依赖来进行配置并使用。
-
模块中所有未导出的包都是模块私有的,他们是不能在模块之外被访问的
- 在
myOne
这个模块下的描述性文件中配置模块导出 - 模块导处格式:
exports 包名;
- 在
-
一个模块要访问其他的模块,必须明确指定依赖哪些模块,未明确指定依赖的模块不能访问
-
在
myTwo
这个模块下的描述性文件中配置模块依赖 -
模块依赖格式:
requires 模块名;
-
注意:写模块名报错,需要按下Alt+Enter提示,然后选择模块依赖
-
-
在
myTwo
这个模块的类中使用依赖模块下的内容
代码:
- 模块结构图
myOne
模块module-info.java
module myOne {
exports com.Study01;
}
myTwo
模块module-info.java
module myTwo {
requires myOne;
}
2. 模块化
- 模块化概述
随着Java
语言的发展,其规模越来越大,导致即使只是运行一个小的程序,程序只需要使用Java部分核心功能,JVM
也要加载整个JRE
环境。
为了给Java
“瘦身”,让Java
实现轻量化,Java9
正式推出了模块化系统。Java
被拆分为N多个模块,并允许Java
程序可以根据需要选择加载程序必须的Java
模块,这样就可以实现Java
以轻量化的方式运行。
3.模块服务的使用
服务:从Java6
开始,Java
提供了一种服务机制,允许服务提供者和服务使用者之间完成解耦,简单的说,就是服务使用者只面向接口编程,但不清楚服务提供者的实现类。
Java9
的模块化系统则进一步的简化了Java
的服务机制。Java9
允许将服务接口定义在一个模块中,并使用uses
语句来声明该服务接口,然后针对该服务接口提供不同的服务实现类,这些服务实现类可以分布在不同的模块中,服务实现模块则使用provides
语句为服务接口指定实现类
服务使用者只需要面向接口编程即可。
模块服务的使用步骤:
-
在
myOne
模块下创建一个包com.Study03
,在该包下提供一个接口,接口中定义一个抽象方法public interface MyService{ void serice(); }
-
在
com.Study03
包下创建一个包impl
,在该包下提供接口的两个实现类test01
和test02
-
在
myOne
这个模块下的描述性文件中添加如下配置- 模块导出:
exports com.Study03;
- 服务提供:
provides MyService with test01;
指定有Service
的服务实现类是test01
- 模块导出:
-
在
myTwo
这个模块下的描述性文件中添加如下配置:- 声明服务接口:
uses MyService;
- 声明服务接口:
-
在
myTwo
这个模块的类中使用MyService
接口提供的服务ServiceLoader
:一种加载服务实现的工具
代码:
- 模块结构
-
myOne
模块①.
MyService
接口
package HandsomeBoy;
public interface MyService {
void service();
}
②.ming
类
package HandsomeBoy.impl;
import HandsomeBoy.MyService;
public class ming implements MyService {
@Override
public void service() {
System.out.println("ming");
}
}
③.lei
类
package HandsomeBoy.impl;
import HandsomeBoy.MyService;
public class lei implements MyService {
@Override
public void service() {
System.out.println("学IT,来黑马");
}
}
④.module-info.java
import HandsomeBoy.MyService;
import HandsomeBoy.impl.ming;
module myOne {
exports HandsomeBoy;
// provides MyService with Itheima;
provides MyService with ming;
}
-
myTwo
模块①.
Test02
类
package cn.itcast;
import HandsomeBoy.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();
}
}
}
②.module-info.java
import HandsomeBoy.MyService;
module myTwo {
requires myOne;
uses MyService;
}