dubbo内核之ioc源码解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/o9109003234/article/details/82848607

核心代码

此方法被调用于 

//为创建好的AdaptiveExtensionClass实例进行属性注入 

 injectExtension((T) getAdaptiveExtensionClass().newInstance()) 

 //为创建好的Extension实例进行属性注入   

--injectExtension(instance)

//为创建好的wrapperClass实例进行属性注入 

--wrapperClass.getConstructor(type).newInstance(instance)) 

整个方法的作用就是通过instance对象实例的setter方法为instance的属性赋值,完成setter注入,即IOC的最经典的注入方式。

详细步骤:

  • 获取instance的setter方法,通过setter方法获取属性名称property和属性类型pt(即paramType的简写)

  • 使用objectFactory创建一个property名称(类型为pt)的对象实例

  • 执行instance的setter方法,注入property实例

其中,比较重要的就是:

Object object = objectFactory.getExtension(pt, property);

这个方法。其中的objectFactory=AdaptiveExtensionFactory实例,其属性

factories = [SpringExtensionFactory实例, SpiExtensionFactory实例]。

getExtension()方法源码

先调用SpiExtensionFactory来实例化;

如果不行,再使用SpringExtensionFactory来实例化

首先是type必须是接口和必须有注解@SPI,获取type的所有ExtensionClasses实现的key,获取type的装饰类,如果有@Adaptive注解的类,则返回该类的实例,否则返回一个动态代理类的实例(例如Protocol$Adpative的实例)

从这里我们可以看出dubbo-SPI的另外一个好处:可以为SPI实现类注入SPI的装饰类或动态代理类。

看一下SpringExtensionFactory的源码:

  • 检查该context是否包含name的bean,

  • 获取name的bean,如果是懒加载或多例的bean,此时会实例化name的bean

  • 如果obj的类型是type或其子类,与instanceof相同

其中的ApplicationContext就是spring中的

再来看看ApplicationContext

关于ApplicationContextAware应用理解

参照:https://www.cnblogs.com/rekent/p/7229987.html

检查ServiceBean的ProviderConfig provider,如果为空,从applicationContext获取ProviderConfig类型的bean(这里查找的过程其实就是看有没有配置<dubbo:provider>),如果获取到了,进行设置

到此,dubbo  --IOC源码就阅读完毕。

更多dubbo源码解读,请关注 Java后端技术栈 微信公众号

猜你喜欢

转载自blog.csdn.net/o9109003234/article/details/82848607