写点什么

主流框架都用 SPI 机制,看一下他们的区别和原理

作者:Java你猿哥
  • 2023-05-04
    湖南
  • 本文字数:1829 字

    阅读完需:约 6 分钟

主流框架都用SPI机制,看一下他们的区别和原理

在 Java 开发领域中,SPI(Service Provider Interface)是一种用于实现框架扩展的机制。Java 本身提供了 SPI 机制,Spring 和 Dubbo 也都有自己的 SPI 机制。本文将介绍 Java、Spring、Dubbo 三者 SPI 机制的原理和区别。

一、Java SPI 机制

Java SPI 机制是 Java SE 提供的一种服务提供者接口,主要用于实现框架扩展。其原理是在 META-INF/services 目录下创建一个以服务接口全限定名为名称的文件,文件中包含实现服务接口的全限定名。当框架需要使用该服务时,通过 ClassLoader 加载 META-INF/services 目录下的配置文件,然后通过反射机制实例化服务实现类。

举个例子,比如 JDBC 的驱动程序,就是使用 Java SPI 机制实现的。在 JDBC 规范中,定义了一个标准的接口(javax.sql.DataSource),不同的数据库厂商可以实现该接口提供自己的 JDBC 驱动程序。在 META-INF/services 目录下创建一个名为 javax.sql.DataSource 的文件,文件中包含实现 javax.sql.DataSource 接口的全限定名,这样当应用程序需要使用 JDBC 驱动程序时,就可以通过 Java SPI 机制动态加载对应的实现类。


二、Spring SPI 机制

Spring SPI 机制是 Spring 框架提供的一种扩展机制,用于实现框架的可扩展性。Spring SPI 机制的原理类似于 Java SPI 机制,只是在实现上有所不同。Spring SPI 机制是通过 Spring 提供的接口(org.springframework.core.io.support.SpringFactoriesLoader)实现的,该接口会在 META-INF/spring.factories 文件中查找实现类的全限定名,并实例化对应的对象。

举个例子,比如 Spring 的事件机制,就是使用 Spring SPI 机制实现的。Spring 提供了一个事件发布器接口(org.springframework.context.ApplicationEventPublisher),应用程序可以通过实现该接口来发布事件。当应用程序发布事件时,Spring 会通过 SpringFactoriesLoader 查找所有实现了 ApplicationEventPublisher 接口的类,并调用相应的方法。

三、Dubbo SPI 机制

Dubbo SPI 机制是 Dubbo 框架提供的一种扩展机制,用于实现框架的可扩展性。Dubbo SPI 机制与 Java SPI 机制和 Spring SPI 机制有所不同,它使用了 Java 的 ServiceLoader 机制。Dubbo 框架提供了一个接口(com.alibaba.dubbo.common.extension.ExtensionLoader),应用程序可以通过该接口加载指定扩展点的实现类。

Dubbo SPI 机制的实现原理如下:

  • 应用程序通过 ExtensionLoader 加载指定扩展点的实现类。

  • ExtensionLoader 在加载实现类时,会查找 META-INF/dubbo 目录下的配置文件,该配置文件包含了实现类的全限定名及其对应的扩展点名。

  • ExtensionLoader 使用 Java 的 ServiceLoader 机制动态加载实现类,并缓存到内存中。

  • 应用程序通过 getExtension 方法获取指定的实现类,ExtensionLoader 会从缓存中获取实现类的实例并返回。

举个例子,比如 Dubbo 的负载均衡机制,就是使用 Dubbo SPI 机制实现的。Dubbo 提供了一个负载均衡接口(com.alibaba.dubbo.rpc.cluster.LoadBalance),不同的负载均衡算法可以实现该接口。在 META-INF/dubbo 目录下创建一个名为 com.alibaba.dubbo.rpc.cluster.LoadBalance 的文件,文件中包含实现 LoadBalance 接口的全限定名及其对应的扩展点名,这样当应用程序需要使用负载均衡算法时,就可以通过 Dubbo SPI 机制动态加载对应的实现类。


四、Java SPI 机制、Spring SPI 机制、Dubbo SPI 机制的区别

4.1 实现方式不同

Java SPI 机制是通过 ClassLoader 动态加载实现类,Spring SPI 机制是通过 SpringFactoriesLoader 查找实现类的全限定名,并实例化对应的对象,Dubbo SPI 机制则使用了 Java 的 ServiceLoader 机制动态加载实现类。

4.2 配置文件不同

Java SPI 机制在 META-INF/services 目录下创建以服务接口全限定名为名称的文件,文件中包含实现服务接口的全限定名。Spring SPI 机制在 META-INF/spring.factories 文件中查找实现类的全限定名,并实例化对应的对象。Dubbo SPI 机制在 META-INF/dubbo 目录下创建以扩展点名为名称的文件,文件中包含实现扩展点接口的全限定名及其对应的扩展点名。

4.3 功能定位不同

Java SPI 机制主要用于实现框架扩展,Spring SPI 机制主要用于实现 Spring 框架的可扩展性,Dubbo SPI 机制主要用于实现 Dubbo 框架的可扩展性。

4.4 扩展点类型不同

Jav a SPI 机制可以用于任何服务接口的扩展,Spring SPI 机制主要用于 Spring 框架提供的接口扩展,Dubbo SPI 机制主要用于 Dubbo 框架提供的接口扩展。

总结

Java SPI 机制、Spring SPI 机制、Dubbo SPI 机制都是实现框架扩展的机制,但它们的实现方式、配置文件、功能定位和扩展点类型都有所不同。应用程序开发者可以根据不同的需求和框架选择不同的 SPI 机制来实现扩展。

用户头像

Java你猿哥

关注

一只在编程路上渐行渐远的程序猿 2023-03-09 加入

关注我,了解更多Java、架构、Spring等知识

评论

发布
暂无评论
主流框架都用SPI机制,看一下他们的区别和原理_ssm_Java你猿哥_InfoQ写作社区