SPI、Spring SPI、SpringFactoriesLoader

一、SPI技术

SPI全名Service Provider interface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。

Java SPI 是JDK内置的一种动态加载扩展点的实现。

这个机制在一般的业务代码中很少用到,但是在底层框架中却被大量使用,包括JDBC、Dubbo、Spring框架、日志接口中都有用到,不同的是有的使用Java原生的实现,有的框架则自己实现了一套SPI机制.

二、Spring SPI

Spring中的SPI相比于JDK原生的,它的功能更为强大,因为它可以替换的类型不仅仅局限于接口/抽象类,它可以是任何一个类,接口,注解

正因为Spring SPI是支持替换注解类型的SPI,这个特性在Spring Boot中的自动装配有体现(EnableAutoConfiguration注解):

Spring的SPI文件是有规矩的,它需要放在工程的META-INF下,且文件名必须为spring.factories ,而文件的内容本质就是一个properties;如spring-boot-autoconfigure包下的META-INF/spring.factories文件,用于自动装配的;

Spring SPI加载spring.factories文件的操作是使用SpringFactoriesLoader,SpringFactoriesLoader它不仅可以加载声明的类的对象,而且可以直接把预先定义好的全限定名都取出来;

三、SpringFactoriesLoader 

SpringFactoriesLoader类的主要作用是通过类路径下的META-INF/spring.factories文件获取工厂类接口的实现类,初始化并保存在缓存中,以供Springboot启动过程中各个阶段的调用。Spring的自动化配置功能,也与此息息相关。

SpringFactoriesLoader 工厂加载机制是 Spring 内部提供的一个约定俗成的加载方式,只需要在模块的 META-INF/spring.factories 文件中,以 Properties 类型(即 key-value 形式)配置,就可以将相应的实现类注入 Spirng 容器中。

Properties 类型格式:

key:value

key:是全限定名(抽象类|接口)

value:是实现类,多个实现类通过逗号进行分隔

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 18:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 18:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 18:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 18:10:02       18 阅读

热门阅读

  1. Linux的内存计算不准如何解决?

    2024-03-18 18:10:02       18 阅读
  2. LLM大模型统一封装接口解决方案

    2024-03-18 18:10:02       21 阅读
  3. VTK中GetOutputPort()和GetOutput()的区别

    2024-03-18 18:10:02       21 阅读
  4. 【Educoder数据挖掘实训】用Cosine计算相似度

    2024-03-18 18:10:02       18 阅读
  5. 蓝桥杯刷题--python-13-并查集

    2024-03-18 18:10:02       18 阅读
  6. 手机怎么弄不同的ip地址

    2024-03-18 18:10:02       19 阅读
  7. C++——基础复习——模拟动态数组容器

    2024-03-18 18:10:02       19 阅读