MST
星途 面试题库

面试题:Java JPMS下模块间服务的提供与消费实现

在Java JPMS环境中,如何创建一个提供服务的模块,并让其他模块能够消费该服务?请描述完整的实现步骤,包括服务接口定义、服务提供者模块配置以及服务消费者模块的调用方式。
27.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 定义服务接口
    • 创建一个Java接口,该接口定义了服务的方法。例如,假设我们要创建一个简单的消息服务,接口可以如下定义:
    package com.example.service;
    public interface MessageService {
        String getMessage();
    }
    
  2. 创建服务提供者模块
    • 模块定义文件module - info.java
      • 在服务提供者模块的src/main/java目录下创建module - info.java文件。假设服务提供者模块名为message.service.provider
      module message.service.provider {
          provides com.example.service.MessageService to com.example.service.consumer;
          exports com.example.service.impl;
      }
      
      • provides关键字用于声明提供的服务接口,to子句指定哪些模块可以消费该服务。这里指定了com.example.service.consumer模块可以消费此服务。exports用于导出服务实现类所在的包,以便其他模块可以访问。
    • 实现服务接口
      • com.example.service.impl包下创建实现类。
      package com.example.service.impl;
      import com.example.service.MessageService;
      public class DefaultMessageService implements MessageService {
          @Override
          public String getMessage() {
              return "Hello from the service provider!";
          }
      }
      
  3. 创建服务消费者模块
    • 模块定义文件module - info.java
      • 在服务消费者模块的src/main/java目录下创建module - info.java文件。假设服务消费者模块名为message.service.consumer
      module message.service.consumer {
          requires message.service.provider;
          uses com.example.service.MessageService;
      }
      
      • requires关键字声明依赖的服务提供者模块。uses关键字声明要使用的服务接口。
    • 调用服务
      • 在服务消费者模块中编写代码来获取并使用服务。
      package com.example.service.consumer;
      import com.example.service.MessageService;
      import java.util.ServiceLoader;
      public class ConsumerApp {
          public static void main(String[] args) {
              ServiceLoader<MessageService> serviceLoader = ServiceLoader.load(MessageService.class);
              serviceLoader.forEach(messageService -> System.out.println(messageService.getMessage()));
          }
      }
      
      • 通过ServiceLoader.load(MessageService.class)获取服务实例,ServiceLoader会查找并加载所有实现了MessageService接口的服务提供者实例,并可以遍历使用。