19-模块化

nobility 发布于 2021-04-05 1243 次阅读


模块化

jdk1.8以及之前的Java程序在编译和执行时jvm都要加载整个jre环境。jdk1.9及以后将jre环境拆分成若干个模块,程序需要什么模块才加载什么模块,所以Java就可以轻量级的运行了

在工具中创建项目时要选择模块项目,在项目中创建模块(要注意项目jdk环境与模块环境保持一致)

Java模块化

定义模块

若想要此模块中的内容被其他模块访问,就必须在该模块工作目录(默认是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();
//调用服务中的方法
此作者没有提供个人介绍
最后更新于 2021-04-05