Skip to content

面试速答(先看这里)

**一句话结论:**在上面这篇中我们已经介绍过了 Dubbo 的 SPI 和 JDK 的SPI 的机制的区别,但是还是有人问,为啥 Dubbo 不直接用 JDK 的SPI 的机制?

60秒标准回答:

在上面这篇中我们已经介绍过了 Dubbo 的 SPI 和 JDK 的SPI 的机制的区别,但是还是有人问,为啥 Dubbo 不直接用 JDK 的SPI 的机制?

其实,已经讲过了,只不过不够那么直接,其实不用的原因,就是 JDK 的SPI 存在的那些缺点,我从上文中总结出几个供大家参考

JDK SPI 机制虽然简单易用,但在灵活性和扩展性上有所不足。 比如说JDK的 SPI 只能加载所有实现类的实例,并不能对实例进行过滤或排序,缺乏对加载顺序、优先级等高级特性的支持。Dubbo 的 SPI 支持扩展点自动激活功能。可以通过键值对的方式在配置文件中指定条件,当满足条件时自动选择对应的实现

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**其实,已经讲过了,只不过不够那么直接,其实不用的原因,就是 JDK 的SPI 存在的那些缺点,我从上文中总结出几个供大家参考:
  • **要点2:**JDK SPI 机制虽然简单易用,但在灵活性和扩展性上有所不足。
  • **要点3:**JDK SPI 机制在加载实现类时会扫描所有的服务提供者配置文件,这会导致性能问题。
  • **要点4:**Dubbo 提供了一种更灵活的依赖注入机制,可以在运行时根据需要注入不同的实现。
  • **要点5:**除此之外,Dubbo 自定义的 SPI 机制还提供了一些高级功能。

**记忆锚点:**SPI → JDK → Dubbo → 更灵活的依赖注入机制 → 这种扫描和加载机制 → 的扩展机制

关键取舍:

  • JDK SPI 机制在加载实现类时会扫描所有的服务提供者配置文件,这会导致性能问题。
  • 特别是在服务提供者较多时,这种扫描和加载机制会带来额外的性能开销。

易错提醒:

  • 其实,已经讲过了,只不过不够那么直接,其实不用的原因,就是 JDK 的SPI 存在的那些缺点,我从上文中总结出几个供大家参考: JDK SPI 机制虽然简单易用,但在灵活性和扩展性上有所不足。
  • 比如说JDK的 SPI 只能加载所有实现类的实例,并不能对实例进行过滤或排序,缺乏对加载顺序、优先级等高级特性的支持。

加分表达:

  • 可以通过键值对的方式在配置文件中指定条件,当满足条件时自动选择对应的实现。

追问准备:

  • 围绕「SPI」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「JDK」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Dubbo」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

📄 ✅Dubbo的SPI和JDK的SPI有什么区别?

打开文档:✅Dubbo的SPI和JDK的SPI有什么区别?

在上面这篇中我们已经介绍过了 Dubbo 的 SPI 和 JDK 的SPI 的机制的区别,但是还是有人问,为啥 Dubbo 不直接用 JDK 的SPI 的机制?

其实,已经讲过了,只不过不够那么直接,其实不用的原因,就是 JDK 的SPI 存在的那些缺点,我从上文中总结出几个供大家参考:

**JDK SPI 机制虽然简单易用,但在灵活性和扩展性上有所不足。**比如说JDK的 SPI 只能加载所有实现类的实例,并不能对实例进行过滤或排序,缺乏对加载顺序、优先级等高级特性的支持。Dubbo 的 SPI 支持扩展点自动激活功能。可以通过键值对的方式在配置文件中指定条件,当满足条件时自动选择对应的实现。

**JDK SPI 机制在加载实现类时会扫描所有的服务提供者配置文件,这会导致性能问题。**特别是在服务提供者较多时,这种扫描和加载机制会带来额外的性能开销。

Dubbo 提供了一种更灵活的依赖注入机制,可以在运行时根据需要注入不同的实现。Dubbo 的扩展机制允许开发者在代码中动态指定和注入扩展点,而不必在编译时确定所有的实现类。这种方式相比 JDK SPI 更加灵活,便于管理和维护。

除此之外,Dubbo 自定义的 SPI 机制还提供了一些高级功能。比如对 AOP 的支持等。