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文件的解析还在后边。