模块化
jdk1.8以及之前的Java程序在编译和执行时jvm都要加载整个jre环境。jdk1.9及以后将jre环境拆分成若干个模块,程序需要什么模块才加载什么模块,所以Java就可以轻量级的运行了
在工具中创建项目时要选择模块项目,在项目中创建模块(要注意项目jdk环境与模块环境保持一致)
定义模块
若想要此模块中的内容被其他模块访问,就必须在该模块工作目录(默认是src目录)中定义一个模块描述文件module-info.java
将要暴露给其他模块的类或包使用exports
关键字进行导出
一旦声明了module-info.java
文件,则若使用不是Java.base模块下的类,就必须在该文件中手动添加依赖关系(类依赖模块关系从JavaDoc文档中可以查看),并且类不允许直接在模块工作目录中,必须存在包中
虽然module-info.java
只是描述模块使用,但是也会编译成module-info.class
文件
module test { //该模块命名必须与外部真正的模块文件夹保持一致
exports com.xxx; //要暴露的包或类
}
引用模块
一个模块要想使用另一个模块中的类或包,则被引用模块需要暴露类或包,引用模块需要依赖引用模块中的类或包,若有依赖后本模块中就不允许出现同名的包了
module test { //该模块命名必须与外部真正的模块文件夹保持一致
requires java.xxx; //依赖的模块,除拉Java.base模块无需手动依赖
}
模块服务
提供服务
module test { //该模块命名必须与外部真正的模块文件夹保持一致
exports com.xxx; //暴露服务接口所在的包
provides MyService with MyServiceImpl;
//提供服务接口是包中的MyService
//服务接口的实现类是MyServiceImpl
}
使用服务
module test1 { //该模块命名必须与外部真正的模块文件夹保持一致
requires test1; //依赖提供服务的模块
uses MyService; //使用依赖模块提供的服务接口
}
ServiceLoader<MyService> myServices = ServiceLoader.load(MyService.class);
//加载服务
Optional<MyService> myServicesOptional = myServices.findFirst();
//获取服务Optional包装对象
myServicesOptional.get().add();
//调用服务中的方法
Comments NOTHING