Java 中的 SPI 是什么?它有什么用?
SPI,全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API。它可以用来启用框架扩展和替换组件,是 Java 的开放性扩展的一种体现。SPI的核心思想是"面向接口编程",也是一种"策略模式",就是将软件的具体逻辑处理过程封装成策略,通过接口来调用,实现解耦合。
如何实现 SPI ?
在 Java 中,SPI 的具体实现步骤如下:
- 在
classpath
下创建一个META-INF/services
的文件夹。 - 在该文件夹下创建一个以接口全名命名的文件,该文件里面写的就是该接口的具体实现类。
- 当外部程序装配这个模块的时候,就能通过该 jar 包
META-INF/services/
里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 - 基于这样一个约定就能很好的找到服务接口的实现类,而不需要通过硬编码将实现类名固定下来。
哪些框架用到了 SPI ?
在 Java 的很多框架中都会用到 SPI,比如 Dubbo, JDBC 等。JDBC 就是一个很典型的使用 Java SPI 的例子。JDBC 的 Service Provider 是驱动程序,每一个驱动程序类都提供一个静态方法 DriverManager.registerDriver()
去注册自己。当驱动被加载后,一个 Driver 实例会被注册到 DriverManager 类里。当用户调用 DriverManager 的getConnection
方法时,DriverManager 会查找适合的驱动程序连接到数据库。
总结
总的来说,SPI 是一种服务发现机制。它通过解耦使得第三方服务可以插入使用,大大提高了系统的扩展性。