我是靠谱客的博主 怕孤单爆米花,最近开发中收集的这篇文章主要介绍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遍历,不能通过具体参数来获取.

最后

以上就是怕孤单爆米花为你收集整理的jdk的SPI 扩展机制的全部内容,希望文章能够帮你解决jdk的SPI 扩展机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部