dubbo 調用時,接口會產生一個代理類,
com.alibaba.dubbo.common.bytecode.proxy0
問題一: dubbo框架是如何跟spring進行整合的?
- 定義dubbo xml標籤
com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\dubbo.xsd
com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\spring.handlers
com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\spring.schemas
- 定義 xml 標籤解析類
-
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
標籤解析類將標籤變爲
RootBeanDefinition
對象,調用beanDefinition.getPropertyValues().addPropertyValue("id", id);
就可以將id
在標籤中的值設置給相應對象的屬性上,
調用parserContext.getRegistry().registerBeanDefinition("Reference" + id, beanDefinition);
註冊方法
將RootBeanDefinition
對象中的bean名字加入到beanDefinitionNames
容器中。RootBeanDefinition beanDefinition = new RootBeanDefinition(); // spring 會把 beanClass 進行實例化 beanDefinition.setBeanClass(beanClass); beanDefinition.setLazyInit(false); String id = element.getAttribute("id"); //註冊 beanDefinition parserContext.getRegistry().registerBeanDefinition("Reference" + id, beanDefinition);
-
問題二:消費者獲取的代理實例是如何創建?
<dubbo:reference id="userService" interface="com.myke.consumer.api.UserService" protocol="dubbo"/>
見類com.alibaba.dubbo.config.spring.ReferenceBean
這個類實現了 FactoryBean
類,
public interface FactoryBean<T> {
// 這個方法是spring 調用的,spring 初始化時候調用,
// ApplicationContext.getBean("beanId")時,就會調用這個方法,
// 這個方法的返回值,會交給spring 容器進行管理
// 這裏其實返回的是 interface 配置的接口代理類
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
見類 com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler
在 invoke
方法中進行了 rpc 遠程調用,
rpc 協議有:http、rmi、dubbo、netty
,所以就會有相應的調用實現,實現都是基於接口的,所以見類com.alibaba.dubbo.rpc.Invoker
的實現類,其中com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker
就是dubbo的實現