首页 > 其他 > 详细

SPI机制之Dubbo中的SPI

时间:2021-06-11 10:45:20      阅读:31      评论:0      收藏:0      [点我收藏+]

  上篇阐述了JDK标准的SPI,并对其应用做了相应的实践。在实际应用中,很多框架都会对其进行扩展改进实现该框架下的SPI。为什么呢?

  通过将上篇的实践案例增加一个HelloService的实现发现其明显的不足,特别是资源紧张的时候:

    技术分享图片

     技术分享图片

   执行主程序,查看结果:

    技术分享图片

   通过结果,可以看到JDK标志的SPI会一次性实例化所有扩展点的实现。如果资源紧张且扩展实现初始化很耗时而有些扩展并没有用上,会相当浪费资源。

  实践中实现类加断点,执行主程序查看其初始化的进度:

    技术分享图片

    技术分享图片

   如果不继续执行,通过结果可以看到打断点本身的实现类不会加载,没有打断点的实现类也不会加载(加载顺序与文件内容顺序一致)。所以可能出现如果有扩展点加载失败,则所有扩张点均无法使用的情况。

  Dubbo框架解决了以上两个问题同时扩展了其他相关的功能。dubbo的jar中可以看到其通过SPI的方式定制化实现了哪些扩展点:

    技术分享图片

  可以看到默认加载的内容文件在dubbo目录下。

  下面实践使用Dubbo扩展点的方式:

    1、引入dubbo依赖,创建接口在接口上标注@SPI

      技术分享图片

     2、实现类项目中

      1)导入api依赖

        技术分享图片

      2)建立实现类

        技术分享图片

      3)SPI进行声明操作

        技术分享图片

    3、执行主程序项目

      1)导入坐标接口项目和实现类项目

        技术分享图片

      2)创建执行类

        技术分享图片

     执行结果如下:

      技术分享图片

  通过上面的的实践案例,使用Dubbo的SPI与JDK标准的SPI好像区别不大,只是在接口类中需加上@SPI这个注解,否则无法加载该扩展。那么这个注解的作用是什么呢?查看该注解源码。

    技术分享图片

   重点关注该注解源码中的注释,详细阐述了该注解的作用:

    技术分享图片

   所以@SPI的本质就是给某个扩展点的多个实现加标签标识,这样即使无法加载也可以很明确的支持哪个标签对应的扩展无法加载,而不是笼统的某类扩展点无法加载。  

  在实践案例中,扩展配置文件内容格式并没有改为<key, value>的形式,但是不影响执行的结果。是不是可以说明dubbo扩展配置文件其实也是支持不使用<key, value>形式的格式文件?

  

  

  前面提及了两个JDK标准中SPI的问题,那么在Dubbo中其解决了么?后续文章介绍。

 

  

    

 

 


  

 

 

 

  

SPI机制之Dubbo中的SPI

原文:https://www.cnblogs.com/ilovebath/p/14869477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!