显卡|Java9新特性中的模块化到底是什么

显卡|Java9新特性中的模块化到底是什么

文章图片

显卡|Java9新特性中的模块化到底是什么

文章图片

显卡|Java9新特性中的模块化到底是什么

文章图片


Java9新特性中的模块化到底是什么Java9中的一个重大特性是增加了一种新型的程序设计组件 - 模块 。
官方对模块的定义为:一个被命名的 , 代码和数据的自描述集合 。 ( the module which is a named self-describing collection of code and data) 。
这个在Java7的时候就已经被提出 , 但由于其复杂性 , 不断跳票Java7、Java8 , 直到Java9才姗姗来迟的模块化 , 到底是什么 , 在实际coding中又有什么用呢?
我们主要从以下三个方面来分析:

  1. What模块化是什么
  2. How模块化怎么用
  3. Why为什么要用模块化
模块化是什么?
模块是Java9中新增的一个组件 , 可以简单理解为是package的上级容器 , 是多个package的集合 , 一个jar可以有多个module , 一个module可以有多个package 。 从代码结构上看 , jar >module> package > class interface 。
Java9的模块通过requires和exports关键字 , 对自身所依赖(requires)的模块和自身暴露(exports)出去的内容(package)进行了声明 。 本模块只能使用其他模块暴露(exports)出来的内容(package) , 其他模块也只能使用本模块暴露(exports)出去的内容(package) 。
Java9的模块化和Maven的区别在于Maven管理的是整个jar的依赖 , 关注的是整体 。 而模块化管理的是这个jar中的模块需要对外暴露的内容和对外依赖的模块 , 关注的是细节 。 maven的依赖是将整个jar都给你了 , 哪怕你仅仅只需要其中的一个类 。 模块化的依赖则是更细粒度的package的管理 , 你只能使用你依赖的模块下被暴露出来的package 。
那么 , 模块化怎么用呢?
我们搭建一个简单的modular-demo项目 , 分为modular-common , modular-persistent , modular-service , modular-web 4个子项目 。
4个子项目的定位为:
modular-common:通用层 , 主要提供常量类、工具类、枚举类等通用代码 。
modular-persistent:持久层 , 主要提供数据库领域实体domain类 , 数据操作接口dao 。
modular-service:service层 , 主要提供业务逻辑处理的service及其实现类 。
modular-web:web层 , 主要对外提供api接口 , 视图渲染 , 输入输出数据处理等功能 。
4个子项目的maven依赖关系为:
modular-persistent依赖modular-common
modular-service依赖modular-persistent
modular-web依赖modular-service
每个项目的代码大致如下:

与传统Maven项目不同的是 , 每个子项目下面都有着自己的module-info.java , 里面声明了项目中的模块暴露出去的包和需要依赖的模块 。
注意:我们提到的模块均是指Java9中的模块 , 不是指maven中的模块 , maven中的模块是指可以构建为一个jar或者war的项目 , 本质是一个项目 , 所以我们用子项目来表示maven中的模块 。 每个子项目可以有多个模块 , demo中每个子项目只包含了一个模块 , 但不代表只能有一个模块 。
common模块的module-info.java

module 后面的modular.demo.common声明了本模块的模块名 , 是本模块的唯一标识 , 其它模块可以通过这个标识来声明对这个模块的依赖 。