Java SPI简介

JavaSPI是一种服务发现机制,允许第三方实现或扩展API。它包括SPI接口、实现类、配置文件和服务加载器四要素。虽然存在如不能按需加载等缺点,但因其解耦特性被广泛应用于JDBC、SLF4J等场景。相比JavaSPI,SpringBoot的自动配置通过spring.factories文件实现更简洁的配置和更高的灵活性。
摘要由CSDN通过智能技术生成

目录

Java SPI

简介

四要素

优点

缺点

应用场景

JavaSPI和SpringBoot自动配置对比

JavaSPI设计思想

SpringBoot自动配置的核心实现


Java SPI

简介

SPI 全称 Service Provider Interface,是 Java 提供的,旨在由第三方实现或扩展的 API,它是一种用于动态加载服务的机制。

Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦

设计思想:面向接口+配置文件+反射

个人理解:首先服务端加载所有可能的类,用户在 src/main/resources/ 下建立 /META-INF/services 目录并且建立以接口命名相应的文件,文件内容为要应用的实现类的全限定类名,即可按需调用!

四要素

  • SPI 接口:为服务提供者实现类约定的的接口或抽象类。
  • SPI 实现类:实际提供服务的实现类。
  • SPI 配置:Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类的完全限定名称。
  • ServiceLoader:Java SPI 的核心类,用于加载 SPI 实现类。ServiceLoader 中有各种实用方法来获取特定实现、迭代它们或重新加载服务。

优点

  • 大大提高接口设计的灵活性
  • 基于面向接口编程,优雅地实现模块之间的解耦

缺点

  • 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费
  • 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类
  • 多个并发多线程使用 ServiceLoader 类的实例不安全

应用场景

  • JDBC
  • SLF4J
  • Servlet容器初始化

JavaSPI和SpringBoot自动配置对比

JavaSPI设计思想

  • 使用约定的配置文件
  • 提供Jar包同时提供配置文件
    • 高内聚低耦合,兼具代码和配置
  • 使用ClassLoader的getResource和getResources方法,来读取classpath中的配置文件

SpringBoot自动配置的核心实现

  • 使用约定的配置文件
    • 文件路径:META-INF/spring.factories
    • 文件内容:key=value1,value2...(key是EnableAutoConfiguration的类名,value是自动配置类的类名)
  • 提供自动配置类的Jar包,也同时提供配置文件META-INF/spring.factories

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值