面试题答案
一键面试- 定义服务接口
- 创建一个Java接口,该接口定义了服务的方法。例如,假设我们要创建一个简单的消息服务,接口可以如下定义:
package com.example.service; public interface MessageService { String getMessage(); }
- 创建服务提供者模块
- 模块定义文件
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!"; } }
- 在
- 模块定义文件
- 创建服务消费者模块
- 模块定义文件
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
接口的服务提供者实例,并可以遍历使用。
- 模块定义文件