SPI

92 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

解耦

耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动。

SPI机制

SPI 机制,全称为 Service Provider Interface,是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在 Dubbo、JDBC 中都使用到了 SPI 机制。本文介绍了 Java SPI 机制以及在模块化和非模块话项目中的实现方式(此处的模块化指 Java9 引入的模块化)

SPI 和 API 有什么区别?

  • API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。
  • SPI (Service Provider Interface)是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现,可用于启用框架扩展和可替换组件。

SPI 的优点

Java SPI 机制中最大的优势是解耦,让接口的定义与具体业务分开,而不是耦合在一起。

SPI 的约定

  • 模块化语句约定
  • 配置文件约定

ServiceLoader

ServiceLoader 是用于加载 SPI 服务实现类的工具 load 方法:可以发现 load 方法支持两种重载后的入参;

SPI感觉了解一下就行。我自己感觉SPI最大的优点就是解耦,说白了就是把两个互相影响的东西分开,就算动了一方,另外一方也不会随之发生变化。SPI感觉就像是一个会变化的模型,当需求者需要的时候就根据需求者而变成需求的模型。