乐趣区

关于spring:Java9系列第8篇Module模块化编程

我打算在后续的一段时间内,写一系列对于 java 9 的文章,尽管 java 9 不像 Java 8 或者 Java 11 那样的外围 java 版本,然而还是有很多的个性值得关注。期待您能关注我,我将把 java 9 写成一系列的文章,大略十篇左右,本文是第 8 篇。

  • java9 系列文章拜访地址

在 Java 9 版本中 Java 语言引入了一个十分重要的概念:模块(module)。如果对 javascript 代码模块化治理比拟相熟的小伙伴,看到 Java 9 的模块化治理,应该有似曾相识的感觉。

一、什么是 Java module?

与 Java 中的 package 有些相似,module 引入了 Java 代码分组的另一个级别。每个这样的分组(module)都蕴含许多子 package 包。通过在一个模块的源代码文件 package 的根部,增加文件 module-info.java 来申明该文件夹及其子文件夹为一个模块。该文件语法如下:

 module xxx.yyy{....}

其中 xxx.yyy 是模块 module 申明的名称,不是 package 名称。

二、模块导出 package

文件 module-info.java 能够指定该模块上面的哪些 package 对外可见、可拜访。通过一个新的关键字 exports 来实现该性能。

 module xxx.yyy{exports com.zimug.java9;}

com.zimug.java9代表一个 package。

须要留神的是:即便给定 package 包中的类是 public 的,如果未通过 ’exports’ 显式导出其程序包,则它们在模块内部也是不可见的(在编译时和运行时都是如此)。

三、模块导入 package

如果另一个模块想要应用被导出的 package 包中的类,能够用 requires 关键字在其 module-info.java 文件中来导入(读取)指标模块的 package 包。

module def.stu{requires xxx.yyy;}

四、Java module 的意义

在笔者看来,Java 9 引入 module 模块化管理系统,更多的是从安全性的角度思考。Java 代码中 90% 以上的破绽都是由反射和拜访权限管制粒度有余引起的,Java 9 的模块化零碎正好能解决这个问题。Java 9 module 提供另一个级别的 Java 代码可见性、可拜访性的管制。

比如说:咱们都晓得当一个 class 被润饰为 private 的时候,意味着这个类是外部类。对于顶级类 (外部类) 来说,只有两种修饰符:public 和默认(default)。这也就意味着一个问题,有些 public class 咱们原本是打算在 jar 包定义的范畴内应用的,然而后果却是任何引入了这个 jar 的我的项目都能够应用这个 jar 外面所有的 public class 代码。

也就是咱们的原意是在无限范畴内提供公开拜访,后果却是无限度的对外公开。在引入 Java 9 模块化之后,能够实现 无限范畴内的代码 public 拜访权限 ,将代码公开辨别为: 模块内部无限范畴的公开拜访 模块外部的公开拜访

五、实例

在此示例中,我将创立两个模块“common.widget”和“data.widget”,并将它们搁置在单个文件夹“modules-examples/src”下。文件“module-info.java”将搁置在每个模块的根文件夹下。
文件及目录格局如下:

D:\modules-example>tree /F /A
\---src
    +---common.widget
    |   |   module-info.java
    |   |   
    |   +---com
    |   |   \---zimug
    |   |           RendererSupport.java
    |   |           
    |   \---org
    |       \---jwidgets
    |               SimpleRenderer.java
    |               
    \---data.widget
        |   module-info.java
        |   
        \---com
            \---example
                    Component.java

第一个模块

本代码文件目录:modules-example/src/common.widget/org/jwidgets/SimpleRenderer.java。这个 package 在后文中没有被 exports。

package org.jwidgets;

public class SimpleRenderer {public void renderAsString(Object object) {System.out.println(object);
  }
}

本代码文件目录:modules-example/src/common.widget/com/zimug/RendererSupport.java。这个 package 在后文中被 exports 了。

package com.zimug;

import org.jwidgets.SimpleRenderer;

public class RendererSupport {public void render(Object object) {new SimpleRenderer().renderAsString(object);
  }
}

模块导出,本代码文件目录:modules-example/src/common.widget/module-info.java。只导出 com.zimug 包, 没有导出 org.jwidgets包。导出的模块名称为common.widget

module common.widget{exports com.zimug;}

第二个模块

模块导入common.widget,本代码文件目录:modules-example/src/data.widget/module-info.java

module data.widget {requires common.widget;}

应用导入模块 common.widget 中的 package:com.zimug。本代码文件门路:modules-example/src/data.widget/com/example/Component.java

package com.example;

import com.zimug.RendererSupport;

public class Component {public static void main(String[] args) {RendererSupport support = new RendererSupport();
      support.render("Test Object");
  }
}

失常编译执行,后果如下:

Test Object

尝试应用未被 exports 的 package 代码

因为包“org.jwidgets”尚未通过“common.widget”模块导出,因而另一个模块“data.widget”无奈应用该 package 包下的类SimpleRenderer。咱们做一个反例,看看会产生什么:

package com.example;
import org.jwidgets.SimpleRenderer;

public class Component {public static void main(String[] args) {SimpleRenderer simpleRenderer = new SimpleRenderer(); 
    simpleRenderer.renderAsString("Test Object");
  }
}

编译报错信息如下:

D:\modules-example\src\data.widget\com\example\Component.java:3: error: package org.jwidgets is not visible
import org.jwidgets.SimpleRenderer;
          ^
  (package org.jwidgets is declared in module common.widget, which does not export it)
1 error

正如咱们所看到的,未被 exports 的 package 上面的 class 即便是 public 的也不能被拜访。

欢送关注我的博客,外面有很多精品合集

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》
退出移动版