【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。

相关推荐
猷咪2 小时前
C++基础
开发语言·c++
IT·小灰灰2 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧2 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q2 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳02 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾2 小时前
php 对接deepseek
android·开发语言·php
vx_BS813302 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868362 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计2 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
qq_177767373 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos