核心代码
此方法被调用于
//为创建好的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后端技术栈 微信公众号