您的位置:首页 > 编程语言 > Java开发

4. dubbo在spring中的初始代

2017-02-16 17:44 162 查看
dubbo使用了spring的自定义的Schema完成了dubbo配置的初始化。

在DubboNamespaceHandler类中完成了dubbo标签的注册。

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 DubboBeanDefinitionParser(AnnotationBean.class, true));
}


DubboBeanDefinitionParser的parse方法中,完成每个标签的解析操作,把标签的内容解析成BeanDefinition对象,并在解析过程中,就把beanDefinition设成了setLazyInit为false,这样工厂初始代时,就会把这些BeanDefinition初始代为具体的bean对象。


RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(beanClass);
beanDefinition.setLazyInit(false);


接下来这些标签的初始代则在ServiceBean中,继续了InitializingBean接口,spring会在自身容器初始代完成之后,回调该接口的afterPropertiesSet方法。
afterPropertiesSet方法会完成dubbo配置的初始代,也就是把前一步中的BeanDefinition转换成具体的java实体。以ApplicationConfig为例


if (getApplication() == null
&& (getProvider() == null || getProvider().getApplication() == null)) {
//ApplicationConfig
Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false);
if (applicationConfigMap != null && applicationConfigMap.size() > 0) {
ApplicationConfig applicationConfig = null;
for (ApplicationConfig config : applicationConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (applicationConfig != null) {
throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
}
applicationConfig = config;
}
}
if (applicationConfig != null) {
//把applicationConfig设置到AbstractInterfaceConfig成员变量中
setApplication(applicationConfig);
}
}
}


BeanFactoryUtils.beansOfTypeIncludingAncestors会从spring工厂中根据类型去拿bean对象,调用了

BeanFactory.getBeansOfType() ->getBean(), 并设置到AbstractInterfaceConfig上。

这样就完成了dubbo的spring配置文件的解析和初如代,而对于dubbo.properties文件的解析还在后边。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dubbo