Dubbo—SPI及自适应扩展原理( 七 )
这个方法就是Dubbo依赖注入的实现 , 从上面代码中我们可以看出该方法是通过setter方法注入依赖扩展的(因为有些扩展点是需要依赖其它扩展点的 , 所以单单初始化当前扩展点还不行 , 还需要注入依赖的扩展):首先通过反射拿到参数的类型 , 然后从setter方法名中获取到扩展点的名称 , 最后从objectFactory中获取依赖的扩展实例并通过反射注入 。 objectFactory这个参数还记得是什么 , 怎么初始化赋值的么?这里具体的实例对象是(不清楚怎么来的忘记了就往上翻翻)AdaptiveExtensionFactory适配类类的对象 , 首先看看该类的初始化:
private final List
这里不难理解 , 初始化时将所有的ExtensionFactory的扩展对象缓存到factories对象 , 然后在getExtension中循环 , 别分别调用它们的getExtension方法:
publicT getExtension(Class type, String name) { // SpiExtensionFactory和SpringExtensionFactoryfor (ExtensionFactory factory : factories) {T extension = factory.getExtension(type, name);if (extension != null) {return extension;}}return null;}
ExtensionFactory的扩展配置文件中只有三个类:
adaptive=com.alibaba.dubbo.common.extension.factory.AdaptiveExtensionFactoryspi=com.alibaba.dubbo.common.extension.factory.SpiExtensionFactoryspring=com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
除开上面的适配类 , 下面分别看看spi和spring做了哪些事:
public class SpiExtensionFactory implements ExtensionFactory {publicT getExtension(Class type, String name) {// 判断是否为@SPI标注的扩展接口if (type.isInterface()if (loader.getSupportedExtensions().size() > 0) {return loader.getAdaptiveExtension();}}return null;}1234567891011121314
该类主要是获取标了@SPI的扩展接口的适配类 , 其中getSupportedExtensions就是加载所有的扩展类 。 想一想ExtensionFactory本身就是被@SPI标注的 , 会在这里再次返回适配类么?再来看SpringExtensionFactory类:
public class SpringExtensionFactory implements ExtensionFactory {private static final Set contexts = new ConcurrentHashSet();public static void addApplicationContext(ApplicationContext context) {contexts.add(context);}public static void removeApplicationContext(ApplicationContext context) {contexts.remove(context);}@SuppressWarnings("unchecked")publicT getExtension(Class type, String name) {for (ApplicationContext context : contexts) {if (context.containsBean(name)) {Object bean = context.getBean(name);if (type.isInstance(bean)) {return (T) bean;}}}return null;}}
这个类也很简单 , 就是从Spring IOC容器中返回对应的扩展对象 。 以上就是Dubbo IOC的实现原理 , 非常简单 , 但也很重要 , 我们通过idea快捷键可以看到只有以下两处调用:一个是createExtension创建扩展类实例时:
injectExtension(instance);Set
推荐阅读
- Linspire 10 Beta版发布 还记得20年前的Lindows吗?
- CES 2021:JBL发布新款耳机 支持自适应噪声消除功能
- 宏碁推Chromebook Spin 514:首配Ryzen 3000 C芯片
- 三星自适应HDR10+调节功能将考虑环境光因素
- 苹果申请新专利:自适应环境光,或用于智能眼镜Apple Glass
- 本田的黑科技又来了 摩托车自动驾驶专利被曝光
- Spin计划为共享滑板车加装传感器 遏制客户的不当停车和骑行行为
- 分布式天花板?阿里百万架构师的ZK+Dubbo笔记,颠覆认知
- 中国工程院院士郭剑波:适应高比例新能源电力系统,电源电网都要改变
- 《今日简史》:人工智能时代,未来10年这样学习才能适应发展