首页 > 其他分享 >SPI

SPI

时间:2023-11-28 16:12:23浏览次数:29  
标签:java jar Driver SPI META INF 加载

概述

SPI(Service Provider Interface)

JDK内置的一种 服务提供发现机制

用来 启用框架扩展和替换组件

 

服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类;

当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了;

 

JDK中查找服务的实现的工具类是:java.util.ServiceLoader

ServiceLoader.load(Search.class)在加载某接口时,会去META-INF/services下找接口的全限定名文件,再根据里面的内容加载相应的实现类;

 

如何使用SPI机制

1、定义标准

  如java.sql.Driver

2、不同服务提供方实现

  如MySQL的com.mysql.jdbc.Driver实现,在MySQL的mysql-connector-java-5.1.46.jar中的META-INF/service中有个java.sql.Driver的文件,里面的内容是对应的MySQLDriver实现;

    

3、应用

  ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);

 

广泛应用

jdbc Driver

java中定义了java.sql.Driver,由不同的数据库厂商提供实现;

MySQL的mysql-connector-java-5.1.46.jar中的META-INF/service中有个java.sql.Driver的文件,里面的内容是对应的MySQLDriver实现;

 

springboot中的SPI机制

在springboot的自动装配过程中,最终会加载META-INF/spring.factories文件,而加载的过程是由SpringFactoriesLoader加载的。

从CLASSPATH下的每个Jar包中搜寻所有META-INF/spring.factories配置文件,然后将解析properties文件,找到指定名称的配置后返回。

需要注意的是,其实这里不仅仅是会去ClassPath路径下查找,会扫描所有路径下的Jar包,只不过这个文件只会在Classpath下的jar包中;

...

 

标签:java,jar,Driver,SPI,META,INF,加载
From: https://www.cnblogs.com/anpeiyong/p/17862199.html

相关文章

  • P9447 [ICPC2021 WF] Spider Walk 题解
    更好的阅读体验很有意思的一道题。设\(f_i\)表示第\(i\)根线的答案,首先有一个关键结论:任意两根相邻的线答案只差一定小于\(1\)。原因显然,可以在无限远的地方加一根线来构造。该结论可以扩展一下,对于距离为\(d\)的两根线,答案之差不会超过\(d\)。考虑进行倒着加线,考虑加......
  • 12、oracle锁表查询spid进行杀掉
    oracle锁表查询spid进行杀掉1、查询SELECTA.SPID,B.SID,B.SERIAL#,B.USERNAMEFROMV$PROCESSA,V$SESSIONBWHEREA.ADDR=B.PADDRANDB.STATUS='KILLED';2、linuxOs执行杀掉进程kill-9SPID......
  • Reference and inspiration from China's strategy for addressing water pollution i
     AccordingtoChina'sthreelineonepermitmeasures,webelievethatthishasacertainreferencevalueforwaterpollutionissuesinAfrica.The"threelines"referstotheecologicalprotectionredline,theenvironmentalqualitybottom......
  • Spin 基于rust 开发的开源运行基于webassembly serverless 工具
    spin是基于rust开发的,可以用来开发以及运行基于webassemblyserverless服务的工具包含的特性提供了周边扩展 默认wasm只提供了基本类型的支持,wasm提供了不少扩展可以方便的支持不同语言的调用(比如网络,数据库访问)提供了快速应该开发的cli提供了服务部署的能力 包含了本......
  • 实现 利用SPI 接口 发送 显示屏 初始化代码
    1`timescale1ns/1ns2modulelcd_spi_top_tb();34regclk_x2_i;5regrst_i;6wirespi_cs;7wirespi_scl;8wirespi_mosi;9wirespi_miso;10wirespi_init_done;111213initialbegin14clk_x2_i=0;15rst_i=0;16......
  • 在ASP.NET Core 中使用 .NET Aspire 消息传递组件
    前言云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列、主题和订阅等功能。.NETAspire组件简化了连接到各种消息传递提供程序(例如Azure服务总线)的过程。在本教程中,小编将为大家介绍如何创建一个ASP.NETCore应用并将提交的消息将发送到服务总线主题以供订阅......
  • QT实战 之自定义控件(QSpinBox+QSlider)
    QT实战之自定义控件(QSpinBox+QSlider)创建自定义控件(QT设计师界面类)打开ui文件,拖拽需要用到的基础控件(QSpinBox+QSlider)事件绑定(注意QSpinBox::valueChanged有重载,需要用函数指针指定信号函数)使用自定义控件(拖拽添加Widget容器控件,右键菜单--提升为,打开提升对话框,填写提升的......
  • 6-1891D-Suspicious logarithms
    题意:思路:分块,先对f(x)相同的分块,在对g(x)相同的分块,注意爆longlnog代码:点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int,int>pll;typedeftuple<int,int,int>TP;constintN=1e7+10;intinf=1e9+7;int......
  • 如何定义Sping上传文件的接口
    我直接通过拓云智能AI搜索获得了如下的答案。避免了花费太长时间也找不到直接答案。--现在百度广告太多了...在Spring中,通过定义Controll层,来实现接口,上传文件比较特殊,需要注意的点:可以使用@PostMapping注解来定义上传音频文件的接口使用MultipartFile类来接受前端上传......
  • STM32快速上手踩坑记录(keil5+CubeMX安装+实现SPI通信)
    硬件:ST-LINKv2+STM32F103C8T6+Kingst逻辑分析仪TM32F103C8T6引脚图STM32F103C8T6引脚图及引脚功能说明_stm32f103c8t6引脚图及功能_eewj的博客-CSDN博客安装keil5官网下载:KeilProductDownloads点击MDK-Arm下载即可,目前最新版本是5.38,公司信息什么的随便填一下,下载之后......