什么是SPI
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。
什么场景使用SPI
在需要动态扩展的地方使用SPI,如数据库驱动,spring boot的starter等。
核心类
ServiceLoader 他的作用就是去META-INF/services/下面找到相应的接口,然后找到对应是实体类进行加载,
SPI和策略模式的区别
如果从代码接入的级别来看,策略模式还是在原有项目中进行代码修改,只不过它不会修改原有类中的代码,而是新建了一个类。而 SPI 机制则是不会修改原有项目中的代码,其会新建一个项目,最终以 Jar 包引入的方式代码。
从这一点来看,无论策略模式还是 SPI 机制,他们都是将修改与原来的代码隔离开来,从而避免新增代码对原有代码的影响。但策略模式是类层次上的隔离,而 SPI 机制则是项目框架级别的隔离。
从应用领域来说,策略模式更多应用在业务领域,即业务代码书写以及业务代码重构。而 SPI 机制更多则是用于框架的设计领域,通过 SPI 机制提供的灵活性,让框架拥有良好的插件特性,便于扩展。
策略模式与 SPI 机制有下面几点异同:
- 从设计思想来看。
策略模式和 SPI 机制其思想是类似的,都是通过一定的设计隔离变化的部分,从而让原有部分更加稳定。
- 从隔离级别来看。
策略模式的隔离是类级别的隔离,而 SPI 机制是项目级别的隔离。
- 从应用领域来看。
策略模式更多用在业务代码书写,SPI 机制更多用于框架的设计。
附 :想了解策略模式的可以看我的另外一篇文章【最优美的设计模式-策略模式】