概述
近期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遍历,不能通过具体参数来获取.
最后
以上就是怕孤单爆米花为你收集整理的jdk的SPI 扩展机制的全部内容,希望文章能够帮你解决jdk的SPI 扩展机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复