24.模块化
模块化
模块化
java成为一种影响深远的语言, 同时也变得越来越臃肿, 为了给java轻量化, Java9推出了模块化系统.
模块的基本使用
基本使用步骤
- 创建模块(按照以前的讲解方式)
- 在模块的src下创建一个module-info.java描述文件, 该文件专门定义模块名, 访问权限, 模块依赖等信息, 描述文件使用模块导出和模块依赖来进行配置并使用
- 模块所有未导出的包都是模块私有的, 无法在模块之外被访问
- 在moduleOne模块描述文件中配置模块导出: exports 包名;
- 一个模块要访问其他模块, 必须要明确指定依赖哪些模块, 未明确指定依赖的模块不能访问
- 在moduleTwo模块描述文件中配置模块依赖: requires 模块名;
- 注意: 写依赖模块报错时, 按下Alt+Enter提示, 选择模块依赖
moduleOne/module-info.java
module moduleOne {
exports package01;
exports package02;
}
moduleTwo/module-info.java
module moduleTwo {
requires moduleOne;
}
Student
package package01;
public class Student {
public void study() {
System.out.println("好好学习");
}
}
Teacher
package package02;
public class Teacher {
public void teach () {
System.out.println("成就学生");
}
}
模块服务的使用
服务使用者只面向接口编程, 但不清楚服务提供者的实现类, 允许服务提供者和服务使用者之间完成解耦
服务使用步骤
-
moduleOne下新建一个包package03, 在该包下提供一个接口, 接口中定义一个抽象方法
public interface MyService{ void service(); }
-
在package03下创建impl包, 提供接口的两个实现类Service1和Service2
Service1
package package03.impl; import package03.MyService; public class Service1 implements MyService { @Override public void service() { System.out.println("服务1"); } }
Service2
package package03.impl; import package03.MyService; public class Service2 implements MyService { @Override public void service() { System.out.println("服务2"); } }
-
在moduleOne模块下描述文件中添加如下配置
服务模块: exports package03 服务提供: provides MyService with Service1; // 指定MyService的服务实现类是Service1
import package03.MyService; import package03.impl.Service1; import package03.impl.Service2; module moduleOne { exports package01; exports package02; exports package03; // provides MyService with Service1; provides MyService with Service2; }
-
在moduleTwo模块描述文件中添加如下配置
声明服务接口: uses MyService;
import package03.MyService; module moduleTwo { requires moduleOne; uses MyService; }
-
在moduleTwo模块的类中使用MyService接口提供服务
- ServiceLoader: 一种加载服务实现的工具
Test02
package pkg;
import package03.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) {
System.out.println(my);
my.service();
}
}
}
注意: 如果报如下错误
Error:Kotlin: The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition
解决方案:
- 菜单栏: Build --> Rebuild Project
衣带渐宽终不悔,为伊消得人憔悴!