首页 > 编程语言 >Java 9模块化关键字及应用场景

Java 9模块化关键字及应用场景

时间:2023-05-11 13:45:14浏览次数:28  
标签:Java myapp 模块化 requires module 关键字 模块 com example

一、背景

Spring Boot 3.0最低要求jdk17,为跟上节奏储备知识。

二、简介

关键字 描述 应用场景
module 定义一个模块 代码隔离,依赖控制,代码可重用性
open module 定义一个像java9之前的开放模块 像Java的旧版本那样允许完全反射
exports...to 指定模块的一部分对外提供的包 限制代码对外可见性,防止包冲突
requires 指定当前模块依赖的另一个模块 控制依赖,避免冲突,提高系统可靠性
requires static 声明一组模块的静态依赖关系 编译时检查依赖关系,以确保程序在运行时能够正确地工作。这对于使用反射或动态类加载的程序特别有用,因为这些程序在编译时无法检测到某些依赖关系,需要在运行时才能动态地加载类。
opens...to 类似于exports,但是会开放当前模块内的包访问权限,便于反射使用 某些框架、工具需要使用反射机制,但是反射机制需要访问私有成员
uses 指定当前模块使用的服务类型 提供SPI机制支持,方便应用程序扩展
provides ...with 指定当前模块提供的服务类型和实现类 提供SPI机制支持,方便应用程序扩展

Java 9模块化关键字应用场景:

  • module:模块化开发,将代码分成多个模块,隔离不同模块的功能,增加代码可重用性。
  • exports:限制代码对外可见性,防止包冲突,控制API的访问权限。
  • requires:控制依赖,避免冲突,提高系统可靠性。避免类路径的问题,方便模块的重构和管理。
  • opens:提供某些框架、工具需要使用反射机制,但是反射机制需要访问私有成员。
  • uses:提供SPI机制支持,方便应用程序扩展。
  • provides:提供SPI机制支持,方便应用程序扩展。

三、基础声明模块与引用

1. 声明一个模块

module com.example.myapp {
    requires java.base;
    requires com.example.mymodule;
}

上述代码定义了一个名为 com.example.myapp 的模块,该模块依赖于 java.base 和 com.example.mymodule 模块。

2.导出包

module com.example.myapp {
    requires java.base;
    requires com.example.mymodule;
    exports com.example.myapp.api; 
}

上述代码将 com.example.myapp.api 包导出到其他模块中,使其可以访问。

3.开放反射访问

module com.example.myapp {
    requires java.base;
    requires com.example.mymodule;
    opens com.example.myapp.internal to com.example.anothermodule;
}

上述代码将 com.example.myapp.internal 包开放给 com.example.anothermodule 模块,以便其可以使用反射访问该包中的类和方法。

4.使用自定义模块路径

module com.example.myapp {
    requires java.base;
    requires com.example.mymodule;
    exports com.example.myapp.api; 
}

上述代码使用 modules 目录中的模块路径来运行 com.example.myapp.Main 类。

四、SPI声明与引用

1.声明所需服务

uses关键字用于指定模块所需的服务,它可以出现在模块描述文件(module-info.java)中。下面是一个示例:

module com.example.myapp {
    requires java.base;
    requires com.example.mymodule;
    exports com.example.myapp.api; 
}

在上面的示例中,my.module模块依赖于some.module模块,并使用了com.example.service.SomeService服务。

2.对外声明所提供服务

provides关键字用于指定模块提供的服务和实现,它也可以出现在模块描述文件(module-info.java)中。下面是一个示例:

module my.module {
    provides com.example.service.SomeService with com.example.service.impl.MyServiceImpl;
}

在上面的示例中,my.module模块提供了com.example.service.SomeService服务,并使用了com.example.service.impl.MyServiceImpl实现。

使用了provides关键字的模块还需要使用uses关键字来指定所需的服务,例如:

public interface SomeService {
    void sayHello();
}
 
public class MyServiceImplimplements SomeService {
    public static void doSomething() {
        System.out.println("Hello, Modules!");
    }
 
    public void sayHello() {
        System.out.println("Hello!");
    }
}
 
module my.module {
    uses com.example.service.impl.MyServiceImpl;
}
 
Iterable<SomeService> services = ServiceLoader.load(SomeService.class);
SomeService service = services.iterator().next();
service.sayHello();

标签:Java,myapp,模块化,requires,module,关键字,模块,com,example
From: https://www.cnblogs.com/snifferhu/p/17390817.html

相关文章

  • Java 服务 CPU 占用过高排查
    先需要找出那个进程占用CPU高。top列出系统各个进程的资源占用情况。然后根据找到对应进行里哪个线程占用CPU高。top-Hp进程ID列出对应进程里面的线程占用资源情况找到对应线程ID后,再打印出对应线程的堆栈信息printf"%x\n"PID把线程ID转换为16进制。......
  • Linux重启Java的.sh脚本shell
    原文链接:https://blog.csdn.net/weixin_44821965/article/details/130039771前言最近看到了项目中重启Java服务的.sh文件,对sh文件里面的命令产生了好奇,于是研究了一下脚本里面每一个命令的具体意义一、.sh文件内容.sh文件里面的内容如下:ps-ef|grepplugins-web|grep-vgre......
  • Java---内部类
    Java---内部类内部类的概念内部类就是一个类内部包含另一个类分类:成员内部类局部内部类(包含匿名内部类)格式:修饰符class外部类名称{修饰符class内部类名称{//}}注意:内用外,随意访问;外用内,需要内部类对象.代码示例publicclassBody{privateSt......
  • Java8相对于Java7新增了什么新特性
    Java8和Java7是两个不同的Java版本,Java8相对于Java7引入了相当多的新特性,以下是Java8相对于Java7新增的重要特性:Lambda表达式:Lambda表达式是Java8最重要的特性之一,它提供了一种简洁的编写匿名函数的方式,有助于编写更加易读和简单的代码。函数式接口和......
  • 【Java】Stream的一些日常操作
    1  前言 Java8出来的stream写法让我们对数据的处理带来了一些写法上的增进,这节就简单记录下平时使用的stream的一些操作,关于stream的书籍,可以看一下Java8实战,里边会有两三章讲解我们的stream。2 常用记录 //根据单个属性或者多个属性去重List<Object>data......
  • java线程池和多线程的使用详解
    Java多线程和线程池使用java多线程实现的几种方法1.继承Thread类继承Thread类,重写run方法,创建线程类对象调用start方法启动线程。publicclassThreadDemo{/***继承Thread类创建线程*/publicstaticclassMyThreadextendsThread{publ......
  • 【Java】Java 继承
    继承继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。<理解:继承就是子类继承父类的特征和行为,即子类从父类继承方法,使得子类具有父类相同的行为。> 示例: 父类packagecom.ext;publicclassDe......
  • java8 数组使用流和收集器格式化拼接数组中字符串并以“,”间隔,且首尾分别用 “[” 和
    方法:Stringresult=artist.stream().map(Art::getName).collect(Collectors.joining(",","[","]"));(注:joining(CharSequencedelimiter,CharSequenceprefix,CharSequencesuffix)方法接受一个字符串序列作为拼接符,并在拼接完成后添加传递的前缀和后缀。假如我们传递的分......
  • Zookeeper_java_API的简介
    1.Zookeeper_java_API的简介1.1)org.apache.zookeeper.ZookeeperZookeeper是在Java客户端主类,负责建立与zookeeper集群的会话,并提供方法进行操作。1.2)org.apache.zookeeper.WatcherWatcher接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两......
  • JavaScript 面向对象编程
    面向对象编程ObjectOrientedProgramming面向对象编程用对象把数据和方法聚合起来。面向对象编程的优点能写出模块化的代码能使得代码更灵活能提高代码的可重用性面向对象编程的原则继承(inheritance):子类/派生类从父类/基类/超类中派生,形成继承结构封装(encapsulati......