当前位置: 首页 > news >正文

SpringBoot SPI

参考

https://blog.csdn.net/Peelarmy/article/details/106872570
https://javaguide.cn/java/basis/spi.html#%E4%BD%95%E8%B0%93-spi

SPI

SPI(service provider interface)是JDK提供的服务发现机制。以JDBC为例,JDK提供JDBC接口,在包java.sql.*。MYSQL, ORACLE各自提供JDBC实现类,分别出包:mysql-connector-j, ojdbc10
SPI将服务接口与服务实现解耦。调用者动态配置JDBC实现包,实现动态加载数据库连接,而不是在代码中显式定义。

与 API的区别

API(Application Programming Interface)是服务提供者的接口,有接口,有实现。调用方直接可以用。比如后端向前端提供的接口。
SPI是服务接口,它只有接口,没有接口的实现。只定义规则。具体实现由不同的包自己定义。

JDK SPI

SPI是一种思想,JDK的实现是java.util.ServiceLoader类和/src/META-INF/接口全限定类名文件。

public interface IShout {void shout();
}
public class Cat implements IShout{@Overridepublic void shout() {System.out.println("catcat");}
}
public class Dog implements IShout{@Overridepublic void shout() {System.out.println("dogdog");}
}

/src/META-INF目录下新增配置文件,文件名是接口全限定类名,文件内容是接口实现者的全限定类名。

文件名
/src/META-INF/services/com.test.spi.IShout
文件内容
com.test.spi.Cat
com.test.spi.Dog

配置好后,ServiceLoader就自动实现加载文件中所有类。

public static void main(String[] args) {ServiceLoader<IShout> serivceLoader = ServiceLoader.load(IShout.class);Iterator<IShout> iterator = serivceLoader.iterator();while (iterator.hasNext()) {IShout shout = iterator.next();shout.shout();}
}

SpringBoot SPI

SpringBoot SPI是对JDK SPI的扩展。
SpringBoot 2SPI实现是在/META-INF/spring.factories文件用一组键值对表示接口与实现。
SpringBoot 3SPI实现是在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件直接写实现类。这与JDK SPI保持一致。

加载流程

SpringBoot启动时,@EnableAutoConfiguration 注解会扫描自动配置类。
在这里插入图片描述
图中getCandidateConfiguration()方法解析META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的内容。
其中,前2行来自本springboot项目的src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。之后的org.springframework.*来自\spring-boot-autoconfigure-3.3.5.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。

自定义项目src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports应用场景:SpirntBoot3无法自动装配DRUID

@Import注解

@Import注解可以将类放入IOC容器。
第一种用法是导入普通类。典型场景:自定义starter时引入@Configuration修饰的配置类,使得配置类中定义的bean都进入IOC容器。

第二种用法是导入ImportSelector接口的实现类,@Import注解将ImportSelector接口的String[] selectImports(AnnotationMetadata importingClassMetadata)方法返回的类放入IOC容器。AnnotationMetadata @Import标注的Class对象的元信息。
图中AutoConfigurationImportSelectorImportSelector接口的实现类,154个类就是这样放入IOC容器的。

第三种用法是导入ImportBeanDefinitionRegistrar接口的实现类,@Import注解将执行ImportBeanDefinitionRegistrar接口的void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)方法。它不返回对象,而是对已有的BeanDefinitionRegistry进行修饰或增强。
典型场景:自定义一个接口。在接口上@Import(ImportBeanDefinitionRegistrar实现类)。然后在实现类里根据自定义接口的参数修改bean

http://www.lryc.cn/news/505002.html

相关文章:

  • uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)
  • 【Apache paimon】-- 集成 hive3.1.3 异常
  • 基于docker部署Nacos最新版本-国内稳定镜像
  • 云计算中的Hive操作详解
  • UE4_控件蓝图_制作3D生命血条
  • 11篇--图像边缘检测
  • 宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)
  • (已开源) 详解4D Radar数据集K-Radar
  • 基于RK3588机器人控制器+3D视觉传感器的送餐机器人解决方案
  • 基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理
  • Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍
  • [Ubuntu] Linux命令收集
  • 鸿蒙应用ArkTS开发-利用axios进行网络请求(实现前后端交互)
  • 【开源】使用环信UIKit for uniapp 做一个IM即时聊天应用
  • 计算机网络知识点全梳理(一.TCP/IP网络模型)
  • 神州数码DCME-320 online_list.php存在任意文件读取漏洞
  • 神经网络基础-神经网络搭建和参数计算
  • Linux入门攻坚——41、Linux集群系统入门-lvs(2)
  • 音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现
  • 了解https原理,对称加密/非对称加密原理,浏览器与服务器加密的进化过程,https做了些什么
  • 山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程
  • tcpdump编译 wireshark远程抓包
  • Web开发 -前端部分-CSS
  • 用 Python Turtle 绘制流动星空:编程中的璀璨星河
  • Java从入门到工作2 - IDEA
  • fastadmin批量压缩下载远程视频文件
  • 【保姆级】Mac如何安装+切换Java环境
  • 2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章
  • Springboot静态资源
  • MTK修改配置更改产品类型ro.build.characteristics