Java 模块化系统:引领代码革命与性能飞跃
JDK 工程结构的问题在说 Java 模块化系统之前,先来说说 Java9 之前的 JDK 在工程结构上的问题,从 JDK 本身的问题说起,Java 从 1996 年发布第一版到 2017 年发布 Java9,中间经历了近 20 年的时间,在这期间发布了无数个大大小小的版本用来支撑新的特性。
在 Java 新特性越来越丰富的同时,也带来了相应的问题。JDK8 是一个广泛使用的版本,我们就以 JDK8 为例,先来看看目录结构在这里插入图片描述在 JDK8 以及之前的版本,我们安装的时候会安装两部分内容
JDK(Java Development Kit)主要用于开发者提供了开发工具和环境 JRE(Java Runtime Environment)主要提供 Java 运行时环境 JDK 是开发 Java 应用的完整套装,而 JRE 则是为了支持已编译的 Java 程序在任何计算机上运行而设计的环境。JDK 内部包含了 JRE,以方便开发者在开发的同时也能直接运行和测试他们的代码
在 jre/bin 目录下有一个 rt.jar 文件,表示的是 runtime,即运行时。JVM 会加载这整个文件来支持 Java 运行时环境,而 rt.jar 文件的大小已经达到 50-60M,也就是说在运行你的 Java 程序之前,就需要花这么多内存来加载 Java 运行时环境,我们来看看 rt.jar 中包含哪些内容在这里插入图片描述我们使用解压工具打开 rt.jar 可以清晰的看到,里面包括的内容很全,基本上包括了 Java 的方方面面,都给你加载进去了。
就算你只写一个 HelloWord,它也给你加载了 Applet、awt 等你根本不会用到的东西。
现在的服务器和个人电脑随便都是 8G、16G 以上的内存,对于 rt.jar 占用的这点内存可能没什么感觉,但在一些对于内存很敏感的领域,Java 这种方式就显得不太合理。Java 官方可能也意识到了这个问题,所以在 Java9 的时候推出了 Java 平台模块系统(Java Platform Module System,JPMS)
Java 平台模块系统(Java Platform Module System,JPMS)JPMS 是在 Java9 发布的,其实从 Java7 开始官方就在准备 JPMS,本来准备在 Java8 中引入 JPMS 的,实在是改动太大,到 Java9 中才正式发布。
其实做过开发的都会想的到,模块化相当于要从整体上重构整个系统,结构调整巨大,对于整个系统考验是很大的,这可能也是 JPMS 从 Java7 开始准备,直到 Java9 才发布的原因。
前面我们说过,在 Java8 及之前的版本中,其实是包括 JDK 和 JRE 两个部分的。但从 Java9 之后,就没有专门的 JRE 了,因为模块化之后,自己可以选择 JVM 加载哪些模块,相当于按需加载就行了,你写 HelloWord 可能只需要一个加载 java.base 就行了。
下面是 JDK11 的结构在这里插入图片描述在 JDK 安装目录下有一个 jmods 目录,在该目录下就定义了 JDK 中各个模块,以.jmod 结尾的文件就是 JDK 中定义的各个模块,我们打开 java.base.jmod 文件看一下在这里插入图片描述可以看到在 java.base 中 class/java/目录中,包括了一些 Java 基础用到的 lang、math、nio 等基础包,没有包插 applet、awt 等不常用的包。
这样按模块化划分之后,一方面可以更好的管理 JDK 的各个模块,另外一方面对于使用者来说,也不用像旧版 JDK 那样一股脑把所有的内容加载到 JVM 中,这样更加合理,也更节省资源。
Java 模块化系统以克服当前所存在的局限时,主要设定了两个目标
对 JDK 本身进行模块化提供一个应用程序可以使用的模块系统上面我们已经看到了 JDK 本身模块化的改造,下面我们就来看看应用程序是如何使用模块系统的
应用程序模块化实现应用程序实现模块化只需要简单的三步就可以完成
定义模块导出模块引用模块先整体看一下,我们定义了三个模块 userModule、OrderModule、GoodsModule,项目的结构如下:在这里插入图片描述
module-info.java 文件 module-info.java 文件是用来定义模块的,在模块的 src 目录下定义一个 module-info.java 文件,内容如下
module UserModule {
}简单的定义了一个 UserModule 的模块,里面内容是空的现在三个模块是独立的,假如在 OrderModule 中需要使用 UserModuler 的 UserService,直接使用肯定是引用不到的,需要进行 exports
exports 如果需要将模块中的内容对外,需要在 module-info.java 中把相应的包 exports 出去
module UserModule {exports com.user;}
如上所示,表示 UserModule 将 com.user 包对外提供服务
requires 如果需要引用其他模块的内容,需要先使用 requires 将模块引用进当前模块,如下
module OrderModule {requires UserModule;}
如上所示,表示 OrderModule 引用了 UserModule,如此在 OrderModule 中就可以使用 UserModule 中 exports 出来的包
如上所示,在 OrderModule 中就可以直接引入 UserService 了
如果你只想将 UserModule 开放给 GoodsModule,可以这样写
module UserModule {exports com.user to GoodsModule;}这样就算 OrderModule 引用了 UserModel,也没办法使用 UserService,因为 UserModule 只开放给 GoodsModule 了
以上就是一个使用模块化来实现模块之间相关调用的简单例子,当然实际的模块化系统不可能这么简单,此处只起到一个抛转引玉的作用,如果对模块化系统比较感兴趣可以去 JDK 官网了解详细的信息
模块化的好处 1、强封装性类和包可以被模块化,只有模块之间声明的接口是对外可见的,提高了代码的封装性,减少了不必要的耦合
2、明确的依赖管理块之间通过 requires 声明依赖,明确指出了哪些模块需要哪些其他模块,避免了隐式依赖和类路径冲突
3、运行时性 JVM 可以仅加载运行应用程序所需的模块,减少了内存占用,提高了启动速度和运行时性能
4、安全性和隔离模块边界强化了安全性,限制了代码的访问权限,降低了攻击面
通过模块化,Java 开发者可以构建更加健壮、高效且易于维护的大型应用程序
前端的世界总是在不断变化,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。Web Components 就是这样一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革。
介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。
看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~
评论