Java SPI
官网上有这么一段描述:
An extensible application is one that you can extend without modifying its original code base. You can enhance its functionality with new plug-ins or modules. Developers, software vendors, and customers can add new functionality or application programming interfaces (APIs) by adding a new Java Archive (JAR) file onto the application class path or into an application-specific extension directory.
大致翻译一下就是动态扩展的意思了—-🐂🍺就完了,翻译啥翻译。
官方文档地址:官方SPI介绍
SPI 简要说明
Dubbo 文档里说明: SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口加载实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。
先来看看Java SPI的使用
1 | // provider |
更详细和深入的SPI说明还是认真看上面官方的文档,已经很详细了。
设计模式里的适配器模式?不是太确定,不过感觉效用不差。至少,将来词典有扩充词汇的时候,只需要实现接口,就可以进行新词汇的查询功能,这样看来有点facade的模式意思—-你不用动,我来动。
Dubbo SPI 源码实现
官网有说明
- Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。并且,Dubbo SPI 除了支持按需加载接口实现类,还增加了 IOC 和 AOP 等特性。
先贴代码,再加注释,最后解读。
todo @home after 10:00 pm
1 | /* |