Java的Service Provider Interface (SPI)机制动态地加载和发现服务

基本说明

“src\main\resources\META-INF\services” 是Java项目中常见的一个路径,这个路径通常被用来放置服务提供者的配置文件。在Java的Service Provider Interface (SPI)机制中,这个目录下的文件被用来注册和发现服务。

具体来说,如果你在src/main/resources/META-INF/services下放置一个以服务接口全名命名的文件(例如,如果你有一个Service接口叫做com.dowhere.MyService,你就需要在这个路径下创建一个叫做com.dowhere.MyService的文件),那么这个文件里的每一行都会被看作是提供这个服务接口的实现类的全限定类名。

这种机制使得在运行时,Java的SPI机制能够找到并加载这些服务提供者,从而让你的代码能够使用这些服务。这种机制非常灵活,因为它允许你在运行时动态地添加或移除服务提供者,而不需要修改使用这些服务的代码。

举个例子,如果你有一个实现 com.dowhere.MyService 接口的类叫做 com.dowhere.MyServiceImpl1,你可以在 src/main/resources/META-INF/services/com.dowhere.MyService 文件中添加一行:

com.dowhere.MyServiceImpl1

然后在使用 com.dowhere.MyService 的代码中,Java的SPI机制就会自动地加载和使用 com.dowhere.MyServiceImpl1 这个类的实例。

Java SPI机制应用场景

Java SPI机制的应用场景非常广泛,以下是一些常见的应用场景:

  1. 扩展日志门面接口实现类:例如,通过SPI机制加载不同的日志实现类,如SLF4J、Log4j等。
  2. 自动类型转换:例如,在Spring框架中,通过SPI机制实现Type Conversion SPI(Converter SPI、Formatter SPI)等。
  3. 分布式框架扩展:例如,在Dubbo框架中,通过SPI机制实现Filter接口的扩展。
  4. 服务发现和加载:例如,ZooKeeper中的服务发现和加载就是通过SPI机制实现的。
  5. 配置中心:例如,通过SPI机制实现配置文件的加载和解析。
  6. 依赖注入:例如,Spring框架中的依赖注入就是通过SPI机制实现的。
  7. 扩展第三方库:例如,扩展JDBC驱动、扩展HTTP客户端等。

Java的SPI动态地加载和发现服务机制

Java的SPI(Service Provider Interface)机制是一种用于在运行时动态加载和发现服务的机制。这种机制是通过Java扩展机制来实现的,它允许第三方提供者为其提供实现,并在运行时由系统自动发现和加载这些实现。

SPI机制的核心是Service Provider接口,它定义了一组规范,第三方提供者必须遵循这些规范才能被系统自动发现和加载。具体来说,SPI接口必须使用javax.annotation包中的@ServiceProvider注解进行标记,同时提供者还需要在META-INF/services目录下提供一个以SPI接口全限定名为文件名的文件,其中包含实现者的全限定类名列表。

当应用程序在初始化时,Java会在启动类加载器(Bootstrap ClassLoader)的类路径(ClassPath)中查找META-INF/services目录,并加载其中所有的文件。这些文件中列出的实现者会被实例化并添加到应用程序上下文中,这样就可以通过SPI接口来访问它们。

例如,假设有一个SPI接口叫做com.dowhere.MyService,它的定义如下:

package com.dowhere;
public interface MyService {
    void doSomething();
}

第三方提供者可以提供一个实现该接口的类,如下所示:

package com.dowhere.impl;
import com.dowhere.MyService;
public class MyServiceImpl1 implements MyService {
    public void doSomething() {
        System.out.println("MyServiceImpl1 doSomething");
    }
}

然后,提供者将该类在META-INF/services目录下创建一个以com.dowhere.MyService为文件名的文件,其中包含该实现者的全限定类名:

com.dowhere.impl.MyServiceImpl1

当应用程序在初始化时,Java会在启动类加载器(Bootstrap ClassLoader)的类路径(ClassPath)中查找META-INF/services目录,发现该文件后将其加载并实例化com.dowhere.impl.MyServiceImpl1类,将其添加到应用程序上下文中。这样,应用程序就可以通过com.dowhere.MyService接口来访问com.dowhere.impl.MyServiceImpl1类的实例了。

在这里插入图片描述
在这里插入图片描述

从游戏中学习Java编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/181011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编写自己的CA和TA与逆向

参考内容《手机安全和可信应用开发》 https://note.youdao.com/s/MTlG4c1w 介绍 TA的全称是Trust Application, 即可信任应用程序。 CA的全称是Client Applicant, 即客户端应用程序。 TA运行在OP-TEE的用户空间, CA运行在REE侧。 CA执行时代…

NB水表能承受最大的水压是多少?

NB水表,作为新一代智能水表,以小巧的体积、稳定的性能和强大的功能赢得了市场的认可。那么,它究竟能承受多大的水压呢?接下来,小编来为大家揭秘下,一起来看下吧! 一、NB水表概述 NB水表&#xf…

森利威尔SL4010 升压恒压 12V升压24V 12V升压36V 12V升压48V

在当今的电子设备中,电源管理系统的设计是非常重要的。为了保证设备的稳定运行,升压和恒压电源的应用已经成为不可或缺的一部分。在这篇文章中,我们将介绍森利威尔SL4010升压恒压电源,它可以实现12V升压24V、12V升压36V、12V升压4…

2023亚太杯数学建模竞赛C题新能源电动汽车数据分析与代码讲解

C题论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和求解、问题5模型的建立和求解)、模型的评价等等, 视频讲解如下&…

C++算法入门练习——相同的二叉查找树

将第一组n​个互不相同的正整数先后插入到一棵空的二叉查找树中,得到二叉查找树T1​;再将第二组n个互不相同的正整数先后插入到一棵空的二叉查找树中,得到二叉查找树T2​。判断T1​和T2​​是否是同一棵二叉查找树。 二叉查找(搜索)树定义&am…

基于springboot实现校园在线拍卖系统项目【项目源码】

基于springboot实现校园在线拍卖系统演示 Javar技术 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&…

Jmeter 分布式压测

为什么要分布式 jmeter是100%纯java开发的程序,虚拟用户是以线程实现的,在大量并发情况下,很容易出现CPU、内存消耗过大的问题,甚至会出现java内存溢出。一般一台电脑设置500-600线程数即可,如果超过1000线程&#xf…

【UE5】组成部分

了解UE游戏的基本构成 资源(Asset): 在UE中,资源(Asset)是指游戏中使用到的各种素材,例如模型、纹理、材质、声音、动画、蓝图、数据表格、关卡等(通常以uasset结尾),他…

2022年全国英烈纪念设施数据,各区县均有!

中国是一个拥有悠久历史和灿烂文化的国家,其英烈纪念设施承载着中国人民对为国家独立、民族解放和民主进步而英勇斗争的先烈们的崇敬和缅怀之情。 这些设施不仅是中国革命历史和先烈精神的重要载体,也是传承红色文化、弘扬革命精神的重要场所。 今天分享…

nint和Pattern matching介绍(C#)

nint 最近看C# 9.0时,发现一个有意思的关键词,就是nint,第一次看到这个,于是好奇心爆棚,就去实际操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);实际结果与int的结果是一样的,那为什…

智能配电室电力监控系统

智能配电室电力监控系统是一种专门针对配电室的电力设备进行实时监控和管理的系统。依托电易云-智慧电力物联网,它采用先进的技术手段,对配电室内的电气设备和环境进行全方位、实时的监测和控制,以确保配电室的安全、稳定运行。 该系统的主要…

戳穿人工智能的六个谎言:辨别真伪

目录 1. AI是智能的 2. 始终越大越好 3. AI毫无透明度和问责制可言 4. AI一贯正确 5. AI严重冲击就业市场 6. AI主宰人类 主要结论 相关拓展 人工智能(AI)无疑是我们这个时代的流行语。特别是随着ChatGPT等生成式AI应用程序的出现,A…

使用Pytorch从零开始构建Transformer

在本教程中,我们将使用 PyTorch 从头开始​​构建一个基本的 Transformer 模型。Vaswani 等人提出的 Transformer 模型。在论文“Attention is All You Need”中,是一种专为序列到序列任务(例如机器翻译和文本摘要)而设计的深度学…

Centos7 mysql8.2.0

一、下载 选择社区开源版 二、解压安装 解压 tar -xvf mysql.tar查看是否存在mariadb,如果存在卸载,可能会有冲突 //查看mariadb rpm -qa|grep mariadb //存在即卸载 rpm -e --nodeps mariadb-libs 开始安装 //需要安装解压后其中几个rpm,包有依赖关系…

python变量、常量、数据类型

一、变量 变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,这些变量可以…

C语言——利用函数递归,编写函数不允许创建临时变量,求字符串长度

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int my_strlen(char* str) {if(*str ! \0)return 1my_strlen(str1);elsereturn 0; }int main() {char arr[] "hello";int len my_strlen(arr); //arr是数组&#xff0c;数组传参&#xff0c;传过去的是第…

Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现

目录 Android和iOS应用程序加固方法详解&#xff1a;混淆、加壳、数据加密、动态加载和数字签名实现 APP 加固方式 iOS APP加固代码实现 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 APP 加固方式 iOSAPP 加固是优化 iOS安全性的一种方法&…

2020年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下面程序,屏幕上最多会看到多少个苹果? A:10个 B:11个 C:1个 D:无法确定 答案:B 第2题 关于下面程序,说法正确的是 ? A:执行 后,马上执行

ChatGPT重磅升级!集简云支持GPT4 Turbo Vision, GPT4 Turbo, Dall.E 3,Whisper等最新模型

在11月7日凌晨&#xff0c;OpenAI全球开发者大会宣布了 GPT-4的一次大升级&#xff0c;推出了 GPT-4 Turbo号称为迄今为止最强的大模型。 此次GPT-4的更新和升级在多个方面显示出强大的优势和潜力。为了让集简云用户能快速体验新模型的能力&#xff0c;我们第一时间整理了大会发…

关于自学\跳槽\转行做网络安全行业的一些建议

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#xff0c;发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答&#…