jdk的SPI 扩展机制

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

首先代码走起:

1.新建一个接口 : HelloService


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



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


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

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

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


5.原理分析

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

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


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


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

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

缺点:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值