Dubbo的SPI机制
java的SPI
SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。
举个例子
项目结构
测试类代码和com.liu.Person文本内容
测试结果
如何运行
从文件中解析出数据,使用反射对对象进行创建,初始化等操作。
- ServiceLoader类中有一个HashMap
- 读取文件后,在jvm虚拟机中加载类对象
- 将对象进行实例化,然后存入HashMap中
java spi 的不足之处
如图所示:
该接口会加载文件下所有的类,不能进行选择,按需取值,所以对此,Dubbo借鉴java Spi 的理念,进行拓展和完善。
Dubbo 的 SPI
用法
- 根据选择的名字获取不同的对象
- 动态代理,AOP功能
- 依赖注入,自动注入
源码
大致流程
-
根据传入的参数,获取相应的对象,如果传入true就创建默认的对象,如果cachedInstances中没有创建的对象,就创建该对象。
-
对实例进行创建,进入 createExtension(name,wrap) 方法
-
进入对class进行加载,进入getExtensionClasses()方法
-
如果缓存中没有,就扫描文件夹,对符合定义的文件进行类加载,存到缓存Map中。
依赖注入的执行函数
反射获取set方法,对实例进行字段注入。