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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值