什么是SPI
机制?
在面向对象编程中,基于开闭原则和解耦的需要,一般建议用接口进行模块之间通信编程,通常情况下调用方模块是不会感知到被调用方模块的内部具体实现。
为了实现在模块装配的时候不用在程序里面动态指明,这就需要一种服务发现机制。Java SPI
就是提供了这样一个机制:为某个接口寻找服务实现的机制。这有点类似IoC
的思想,将装配的控制权移交到了程序之外。
SPI
(Service Provider Interface
),是JDK
内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件。
SPI
主要是被框架的开发人员使用,比如java.sql.Driver
接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL
和PostgreSQL
都有不同的实现提供给用户,而Java
的SPI
机制可以为某个接口寻找服务实现。Java
中SPI
机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。
当服务的提供者提供了一种接口的实现之后,需要在classpath
下的META-INF/services/
目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar
包(一般都是以jar
包做依赖)的META-INF/services/
中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK
中查找服务的实现的工具类是:java.util.ServiceLoader
。
为什么要实现SPI
机制?
SPI
是专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。
SPI
将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦,能够提升程序的扩展性、可维护性。修改或者替换服务实现并不需要修改调用方。