【Java】浅谈ServiceLoader

一,概述

**ServiceLoader**是 Java 平台中用于实现服务提供者接口的一种机制,它允许代码发现并加载实现某个接口的具体服务提供者。这种机制通过接口和配置文件的组合来实现动态发现和加载服务,而无需硬编码具体的实现类。

核心概念

  1. 服务接口:定义了一个 API,多个实现类可以实现该接口。
  2. 服务提供者:实现服务接口的具体类。
  3. 配置文件META-INF/services/目录下的文件,用于列出实现了某个接口的服务提供者类。

二,实例

1,定义接口

2,实现接口

注意,这个接口实现可在任何地方,比如其他jar包等。并且实现类必须提供无参构造方法,用于第4步的实例化。

3,配置文件

文件目录在 /META-INF/services/下

本文是 src/main/resources/META-INF/services/com.zjw.java.serviceloader.ISystemInterface

即services目录下存放接口定义的完整报名文件,文件里声明实现类即可,如下

4,注解配置

如果觉得第三步太麻烦,可以通过@AutoService注解直接配置,此注解会自动生成META-INF/services/对应实例文件,

需要引入如下依赖

com.google.auto.service:auto-service-annotations

com.google.auto.service:auto-service

就能通过@AutoService声明实现类,如下

5,加载实例

通过load方法直接加载一个iter对象,在迭代器中获得实例即可,

输出如下

三,原理

ServiceLoader.load方法会通过AppClassLoader加载配置文件中声明的实例,

ServiceLoader实现了Iterable接口,通过指定META-INF/services路径获得配置文件,

随后通过Class.forName加载Class对象,在通过newInstance方法反射实例

在Android开发中,META-INF/services在apk包中,一般通过@AutoService配置实现类,

处理此注解的Processor是AutoServiceProcessor,关键代码如下

生成配置文件,指定目录就在META-INF/services。

相关推荐
TTGGGFF1 小时前
Supertonic 部署与使用全流程保姆级指南(附已部署镜像)
开发语言·python
木木木一2 小时前
Rust学习记录--C7 Package, Crate, Module
开发语言·学习·rust
love530love2 小时前
升级到 ComfyUI Desktop v0.7.0 版本后启动日志报 KeyError: ‘tensorrt‘ 错误解决方案
开发语言·windows·python·pycharm·virtualenv·comfyui·comfyui desktop
Evand J3 小时前
【MATLAB例程】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,附MATLAB代码下载链接
开发语言·matlab·无人机·无人车·uav·协同定位·ugv
chao1898443 小时前
基于MATLAB实现多变量高斯过程回归(GPR)
开发语言·matlab·回归
ytttr8738 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
天远Date Lab8 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python
listhi5208 小时前
基于Gabor纹理特征与K-means聚类的图像分割(Matlab实现)
开发语言·matlab
野生的码农8 小时前
码农的妇产科实习记录
android·java·人工智能
qq_433776428 小时前
【无标题】
开发语言·php