频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
dubbo在spring中的初始代
2017-02-17 09:25:53      个评论    来源:v587的博客  
收藏   我要投稿

dubbo在spring中的初始代: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 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文件的解析还在后边。

点击复制链接 与好友分享!回本站首页
上一篇:centos安装redis和php-redis扩展
下一篇:dubbo服务的发布
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站