Java9模块化学习总结

news2024/11/17 9:32:42

文章目录

        • JDK9 模块化新特性
        • JDK9 模块化入门案例
        • JDK9 模块化知识图谱
          • 1)模块化语法
          • 2)模块化迁移
        • 小结

JDK9 模块化新特性

在 JDK9 之前,在日常开发中可能会遇到过以下问题:

  • 工程依赖工具包的内部实现类。比如 sun.misc.BASE64Encoder 是 JDK 的内部方法,不属于 JDK 标准库范畴,但在工程代码中可以直接使用,破坏了 JDK 的封装性。
  • 类路径地狱。Java 运行时,JVM 会从 jar 包中抽取所有类打平构成一张列表,然后顺序查找类。查找过程可能遇到类冲突(如遇到同名类),若来自不兼容的类,很可能会导致运行时异常,这一切都是未知的。
  • 工程打包时包括直接和间接依赖的包。 比如工程在 JDK8 上运行,即使只依赖了部分包,也需要打所有的 JDK8 基础包,无法按需打包。

2017 年 JDK9 引入了“模块化”的概念后,上述问题都得到了一定的解决。模块化将类和资源封装在模块中,仅导出其他模块需要访问的公共包。从概念上可以看出模块化必须遵循三个核心原则:

  • 强封装性:隐藏模块实现内部细节,分离供其他模块访问的公开代码

  • 定义良好的接口:模块需要向其他模块公开定义良好且稳定的接口

  • 显式依赖:模块间的依赖关系可以产生一个模块图:节点表示模块,边缘表示模块间的依赖关系

某种程度上,模块化中模块有些类似于微服务中的应用:微服务应用相对于模块、微服务对外暴露 API 相对于模块公共导出包、微服务的 API 依赖(如maven pom文件)相对于模块的依赖描述符(module-info文件)。

在这里插入图片描述

JDK9 模块化入门案例

通过案例学习 JDK9 模块化语法是最快的学习方法,详细示例代码参考:

  • Github:https://github.com/zhuqiuhui/Jdk9ModularityExamples(借助于 Intellij Idea 提供了 maven 工程和普通 java 工程两种写法)

示例中 com.zqh.people.api 模块是抽象 api 模块,提供了People 抽象类。com.zqh.people.male 和 com.zqh.people.femal 模块是抽象 api 模块的服务实现,com.zqh.people.client 是客户端模块。相应的模块关系图如下:

在这里插入图片描述

附代码结构图(IntelliJ IDEA 2017.3 以上版本支持 JDK9 模块化编程,IDEA 关于 JDK9 支持详细参考:Getting Started with Java 9 Module System):

在这里插入图片描述

JDK9 模块化知识图谱

在这里插入图片描述

JDK9 模块化知识图谱重点两部分内容:模块化语法模块化迁移

1)模块化语法

​ 模块化语法通过上述案例基本掌握,同时案例使用了服务实现来解耦不同的模块实现(provides 和 uses 关键字)。除此之外,JDK9 模块化强调代码的强封装性,不允许访问封装的包以及深度反射其他模块中的代码,这一点对常用的开发框架(如 Spring 依赖注入通过反射初始化Bean)不那么友好,JDK9 提供了开放式模块,即只需在模块描述符中添加关键字 open,就可以开放一个模块(示例如下):

open module com.zqh.people.female {
    requires com.zqh.people.api;
    provides javamodularity.com.zqh.people.api.People with javamodularity.com.zqh.people.female.Female;
}

与此同时 JDK9 提供了一些命令参数供模块块工作编译和运行,开发过程中可借助于 Intellij Idea 进行开发提效。

在这里插入图片描述

2)模块化迁移

JDK8 及以前版本的工程升级到模块化工程的核心思路:先将工程升级到 JDK9,确保工程能在 JDK9 环境上正常运行,再进行模块化迁移。模块化迁移过程中可借助于开放式包、自动模块等 JDK9 提供的特性。另外,在迁移过程中可能需要拆分/聚合包,重点注意点如下:

  • 精益化模块:模块应尽可能的小,与外界有定义良好的协议,同时尽可能保持独立
  • 模块只能访问通过 requires 语句的公共包,不允许访问封装的包以及深度反射其他模块中的代码
  • 模块不允许循环依赖
  • 模块系统不允许拆分包。只允许一个模块可以将给定的包导出到另一个模块

小结

据 2023 年 4 月发布的《2023年Java生态系统状况报告》统计,2023 年超过 56% 的应用使用 JDK11(相对于去年 48.44%,前年 11.11%),JDK8 到2023年使用率下降到 32.99%。

在这里插入图片描述

上述升级到 JDK9 及以上版本的用户中,真正使用模块化编程的数据不得而知,抛开技术负责人固步自封等主观因素,很多人不升级到最新版本的 JDK最大的原因是:JDK9 全新的模块化机制是 JDK 代码的一大变革。然而模块化的优点是显而易见的,随着 JDK 特性不断的迭代,未来必将有越来越多的库和代码工程支持模块化版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wi-Fi 联盟的协议和标准

关于 WI-FI Wi-Fi技术(Wireless Fidelity)是一种用于在无线局域网(WLAN)中进行无线数据通信的技术。它基于IEEE 802.11标准,并使用无线电波进行数据传输,使设备能够通过无线信号进行互联和互通。 Wi-Fi协…

ubuntu22.04配置双网卡双静态ip不通网段访问服务器的相同服务

ubuntu22.04配置双网卡双静态ip不通网段访问服务器的相同服务 技术博客 http://idea.coderyj.com/ 1.需求 南方电网网段(假如)是 192.168.3.1的网段机器人服务器在隧道ip是 172.16.1.1网段要求这2个网段都能访问到服务器上的服务 2.解决方案 服务器上配置双网卡 双ip 以ubun…

力扣 -- 剑指offer47.礼物的最大价值

题目链接&#xff1a;剑指 Offer 47. 礼物的最大价值 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想对这道题的详细解答&#xff0c;相信各位小伙伴都能看懂并且掌握这一道题的。 参考代码&#xff1a; class Solution { public:int maxValue(vector<ve…

AutoSAR系列讲解(入门篇)4.5-BSW的Mode Management功能

一、架构与术语解释 Mode Management&#xff1a;模式管理&#xff0c;可以理解为对状态的管理&#xff08;比如ECU的上电、下电和休眠&#xff1b;CAN通讯的开启和关闭都是状态&#xff09;。主要管理的对象有ECU、BSW和COM&#xff08;通信中又可以细分很多&#xff09;。由…

概率论--数学期望与方差--协方差(详解)

目录 数学期望与方差 离散型随机变量的数学期望 注意 连续型随机变量的数学期望 方差 常用随机变量服从的分布 二项分布 正态分布 随机向量与随机变量的独立性 随机向量 随机变量的独立性 协方差 协方差的定义 协方差的意义 协方差矩阵 数学期望与方差 离散型随机…

STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

C语言编程语法—结构

C 的令牌&#xff08;Tokens&#xff09; C 程序由各种令牌组成&#xff0c;令牌可以是关键字、标识符、常量、字符串值&#xff0c;或者是一个符号。例如&#xff0c;下面的 C 语句包括五个令牌&#xff1a; printf("Hello,World! \n"); 这五个令牌分别是&#x…

【Servlet学习六】Cookie 与Session 实现登录与上传文件

目录 一、Cookie与Session&#xff08;掌握&#xff09; &#x1f308;1、Cookie是什么&#xff1f; &#x1f308;2、Session是什么&#xff1f; 二、代码功能演示 &#x1f308;1、实现登录功能&#xff08;掌握&#xff09; &#x1f308;2、实现上传文件功能&#xf…

基于深度学习的高精度扑克牌检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度扑克牌检测识别系统可用于日常生活中或野外来检测与定位扑克牌目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的扑克牌目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

打造专属个人模型-私有独立离线模型部署-阿里云GPU服务器配置

阿里云有免费的机器学习 GPU 服务器&#xff0c;免费试用活动页https://free.aliyun.com只要没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的免费额度&#xff0c;3个月内使用。 选择第一个进行立即试用 可以看到试用的界面 如果遇到下面的错误&#xff0c;当前账号没有权…

【跳棋】跳棋游戏-多人游戏-微信小程序开发流程详解

看到跳棋游戏&#xff0c;一个2到6人可一起玩的游戏&#xff0c;于是联想起&#xff0c;自己上小学时候陪同学们玩过的弹珠游戏&#xff0c;是不是跟跳棋游戏很像呢&#xff0c;看了跳棋玩法&#xff0c;有兴趣就研究&#xff0c;这里把跳棋游戏给弄出来了&#xff0c;想知道地…

com.alibaba.druid.pool.DruidDataSource报错(显示红色)

springbootAlibaba项目,application.yml配置如下&#xff1a; 圈中的地方报错&#xff0c;pom.xml也引入了druid依赖,如图&#xff1a; 最后改为&#xff1a; 解决。

Halcon学习之一维测量(2)

在Halcon学习之一维测量(1)文章中,我们介绍了直线测量中的基于边缘对的,还有一种是不基于边缘对的,而是基于边缘的。 接下来讲解就以,Halcon自带的例子,芯片pin引脚测量为例子,主要测量引脚的数量,引脚的平均宽度,还有引脚之间的距离: 源码: * Pin Measurement…

攻防世界-Crypto-Normal_RSA

题目描述&#xff1a;下载附件后&#xff0c;附件中只有两个文件&#xff0c;一个是加密后的密钥&#xff0c;一个是公钥文件 背景知识&#xff1a;RSA加密算法 现在相当于给出了密文和公钥&#xff0c;需要我们去求解明文 1. 思路分析 既然要解密&#xff0c;那么必须要获取…

【数据结构与算法】树和二叉树练习题(选择填空)

【数据结构与算法】树和二叉树练习题&#xff1a;选择填空类型 Ⅰ.知前序和中序推理后序Ⅱ.知后序和中序推理前序Ⅲ.深度/广度遍历Ⅳ.通过遍历推理树的形状Ⅴ.树节点问题 Ⅰ.知前序和中序推理后序 题目名称&#xff1a; 1.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff…

ChatGPT实战:项目管理

人工智能有可能彻底改变许多行业&#xff0c;包括项目管理&#xff0c;及时了解最新技术以及它如何影响你的工作至关重要&#xff0c;因为学习好项目管理&#xff0c;不管你能不能做项目经理&#xff0c;在生活、工作的方面方面都会享受到懂得项目管理后带来的收益。 下面我们借…

np.averag的运算规则

今天写代码的时候&#xff0c;计算加权平均&#xff0c;一直没有搞懂np.average是怎么运算的&#xff0c;做个笔记记录一下&#xff1a; 创建一个&#xff08;3,4,5&#xff09;维度的np数组&#xff0c;然后在创建一个[1,0.5,1]的权重数组&#xff0c;计算他们的加权平均&…

Spring Boot Actuator实现应用监控

1、Spring Boot Actuator实现应用监控 前面的例子中&#xff0c;我们学习的都是 Prometheus 自身的内容&#xff0c;即监控的都是机器或者系统层面的指标。那么如果我 们需要对 Java 应用做监控&#xff0c;例如&#xff1a;监控 JVM 的信息&#xff0c;监控 Spring Bean 的信…

如何实现多 Tab 同步登陆和退出

一. 场景再现 前两天接到一个需求&#xff0c;要求实现类似于 B站 的那种&#xff0c;当我同时打开多个 Tab 标签的时候&#xff0c;如果我在某一个窗口退出了&#xff0c;那么其它窗口的登陆状态也需要同步退出。如下图&#xff0c;我同时打开了两个 tab 。 当我点击其中一个…

【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?

在我们开发项目的时候&#xff0c;会有多个开发环境&#xff0c;比如测试环境&#xff0c;生产环境&#xff0c;开发环境&#xff0c;产品环境等环境&#xff0c;如下 怎么多的配置文件&#xff0c;那么哪一个配置文件会生效&#xff1f;我们如何指定我们需要的配置文件&…