JDK模块化思想~

1、背景

JDK 9 是 Oracle 在 2017 年发布的一个重要版本,它引入了 Java 平台模块系统(JPMS),也称为 Jigsaw 项目。这一特性是 JDK 9 最显著的改进之一,旨在解决 Java 应用程序在规模扩大时面临的挑战,尤其是类路径问题。

在 JDK 9 推出模块化之前,Java 应用程序依赖于一个扁平化的类路径(classpath),这种结构在处理大型应用程序或企业级系统时存在一些固有的问题。随着应用程序的增长,类路径变得越来越复杂,难以管理和维护。此外,当多个库包含相同类的不同版本时,类路径可能会导致冲突,即所谓的“jar hell”。

为了解决这些问题,并提供更清晰的依赖管理,JDK 9 引入了模块的概念。模块化允许开发者将代码组织成逻辑单元——模块,每个模块可以声明其对其他模块的依赖关系以及导出哪些包供外部使用。这不仅有助于减少类路径上的混乱,还提高了系统的可维护性和可扩展性。

通过模块化,开发人员能够更好地控制应用程序的依赖关系,并且能够更有效地利用 Java 的安全性特性来保护模块不受恶意代码的影响。此外,模块化还有助于优化应用程序的启动时间和运行时性能,因为 JVM 可以根据模块声明的需求加载必要的类和资源。

2、jdk9模块化介绍

(1)整体结构
在这里插入图片描述
(2)组件解说

(i)module-info.java
module-info.java 文件是 Java 模块系统的核心组成部分,用于定义 Java 模块的信息。从 JDK 9 开始,这个文件被用来描述模块的元数据,包括模块名称、它导出的包、它打开的包以及其他模块依赖等信息
搭建方式:在对应模块java包下创建一个名为module-info.java的文件,内容格式:module 路径.模块名称{}

module <模块名> {
    // 模块声明,例如导出包、打开包、依赖其他模块等
}

eg:
在这里插入图片描述
在这里插入图片描述
(ii)requires
requires 关键字用于声明一个模块对其它模块的依赖关系。这意味着当前模块需要使用到另一个模块所提供的类或服务。在 module-info.java 文件中,requires 子句用于指定这些依赖关系。
搭建方式:直接在module-info.java module-info.java 文件中编写,requires 模块名

requires <模块名>;

eg:
在这里插入图片描述
在这里插入图片描述若使用idea,我们可以通过以上方式让工具帮我们添加依赖,将鼠标放到报红的包路径,点击提示即可
在这里插入图片描述
(iii)exports
exports 关键字用于指定模块对外公开的包,也就是允许其他模块访问的包。这使得模块之间的交互更加可控,同时也增强了代码的安全性和封装性。
搭建方式:直接在module-info.java module-info.java 文件中编写,exports 包名

exports <包名>;

eg:
场景: mo2–(导包)–>mo1
按道理mo2能用到mo1的所有类,但使用了模块化,会被限制住
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/927ec1d3fc974ff080ccedb5946d6662.png
在这里插入图片描述

若想使用则需要使用到exports ,在模块1暴露出去
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
(iv)opens
opens 关键字用于指定模块中的包可以被其他特定模块通过反射等方式直接访问。与 exports 不同,opens 允许其他模块访问一个模块内的包,但这些包不会被视为正式的 API 部分,因此它们的类、接口和方法可能不会受到向后兼容性的约束。

eg:
场景:web启动,通过反射访问模块的类
在这里插入图片描述
在这里插入图片描述
另外模块通过反射获取某一模块的类
在这里插入图片描述

(V)uses
uses 关键字用于声明模块在运行时需要动态加载的服务提供者接口。适用于需要动态加载服务实现、框架扩展、插件系统以及配置驱动的服务加载等场景。通过使用 uses,可以实现更加灵活、可扩展和松耦合的设计。
搭建方式:

uses <接口全限定名>

注意:使用了uses标准的接口是spi接口是在运行时去找其实现,普通接口则是在编译就确定了实现
在这里插入图片描述

(vi)provides
provides 关键字用于声明模块提供的服务实现。当一个模块声明了一个 SPI(Service Provider Interface)接口的实现时,可以通过 provides 语句来指定哪些类实现了这个接口。这使得 Java 运行时环境(JRE)能够在加载 SPI 接口时找到对应的实现类。
搭建方式:

provides <接口全限定名> with <实现类全限定名>;

在这里插入图片描述
注意:使用了provides…with…只是指定了接口和实现的关系而不是指定这个接口在这模块实现就是这个,若在spring boot中一个接口的具体实现还是依注入的为准,若一个接口有多个实现,若想要注入想要的实现,可以在实现类使用@Primary,或在注入属性上用@Qualifier指定名字注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值