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

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

文章图片

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

文章图片

Java|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声明了本模块的模块名 , 是本模块的唯一标识 , 其它模块可以通过这个标识来声明对这个模块的依赖 。
exports com.hanmc.example.modulardemo.common 声明了本模块暴露出去的package , 如果所有package都没有暴露 , 那么其他模块即使依赖了这个模块 , 也依然无法使用此模块中的代码 。
persistent模块的module-info.java

将domain和dao两个package暴露出去 , 同时声明了对modular-common和mybatis-plus框架中的模块的依赖 。
service模块的module-info.java

将service这个package暴露出去 , 同时声明了对modular-persistent和spring框架中模块的依赖 。
注意:modular-service模块只暴露了com.hanmc.example.modulardemo.service这个package , 并没有暴露com.hanmc.example.modulardemo.service.impl这个包 , 所以外部是无法使用service接口的实现类的 , 只能通过service接口来调用 , 对于使用者来说隐藏了具体的实现 。
web模块的module-info.java

声明了对spring框架和modular-common、modular-persistent、modular-service的模块的依赖 。 同时将com.hanmc.example.modulardemo的package开放给spring的模块使用 , 以便spring在启动时通过反射机制访问项目中的代码来初始化容器 。