本文试图去阐述ddubbo消费者的对象注入容器的过程。本文并未完成,后续会继续补充
基础知识
- spring标签自定义
- FactoryBean使用
- jdk动态代理
解析流程
- 由于使用了spring自定注解,从META-INF/spring.handlers,找到自定义注解命名空间定义类com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler所有解析流程都在:com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser#parse方法中进行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class DubboNamespaceHandler extends NamespaceHandlerSupport {
static {
Version.checkDuplicate(DubboNamespaceHandler.class);
}
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}
}
bean对象的获取
- 通过上次分析可知从spring容器中获取的对象为com.alibaba.dubbo.config.spring.ReferenceBean, 从源代码中截取了部分代码由于实现了org.springframework.beans.factory.FactoryBean,所以bean对象最终获取对象为com.alibaba.dubbo.config.spring.ReferenceBean#getObject
1
2public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean {
}
进一步深入getObject方法,可以看到:com.alibaba.dubbo.config.ReferenceConfig#init中进行了代理对象生成