近期Dubbo加入apache孵化项目,gitHub上面的名称也改为incubator-dubbo,作为现在比较火的开源项目,希望前景一片大好,最近在研究Dubbo的源码,发现Dubbo对于SPI扩展机制的应用对框架来说很优雅.于是整理了一个JDK的SPI例子分享一下.

首先代码走起:

1.新建一个接口 : HelloService

jdk的SPI 扩展机制

2.新建两个接口的实现类

jdk的SPI 扩展机制

jdk的SPI 扩展机制

3.在根路径下新建META-INF/services,文件名称为接口的全限定名,内容为接口实现类的全限定名

jdk的SPI 扩展机制

com.demo.dubbo.spi.service.impl.DefaultHelloService
com.demo.dubbo.spi.service.impl.CustomHelloService

至于为什么这么新建,下面分析原理的时候会说.

4.新建测试类测试SPI扩展是否成功

jdk的SPI 扩展机制

5.原理分析

主要是通过jdk的ServiceLoader类实现,查看源码:

在第一次调用load方法的时候,只是new了一个迭代器,并没有去获取文件里面的内容.属于懒加载状态.

jdk的SPI 扩展机制

接下来遍历这个创建的ServiceLoader,遍历的过程中,首先会去加载之前在项目中配置的接口资源:

jdk的SPI 扩展机制

这就是为什么要这么取名的原因,接下来通过for循环调用ServiceLoader中的hasNext()和Next()方法得到该Service的实现类.

总的来说上面就是jdk自带的SPI扩展机制.

缺点:

只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。获取实现类的方式只能通过Iterator遍历,不能通过具体参数来获取.

相关文章:

  • 2021-08-22
  • 2021-08-15
  • 2021-12-16
  • 2022-02-02
  • 2021-05-07
  • 2021-11-21
  • 2022-12-23
  • 2023-02-13
猜你喜欢
  • 2021-12-11
  • 2022-03-02
  • 2021-12-13
  • 2022-01-01
  • 2021-05-16
  • 2021-08-20
相关资源
相似解决方案