dubbo的啓動過程(二)--服務方屬性配置

BeanDefinition有了,就會建立bean,bean的建立中,提到了若是實現了InitializingBean接口,就調用他的afterPropertiesSet方法,恰好,上面的bean有兩個是實現了InitializingBean接口。分佈是ServiceBeanReferenceBean,這邊先看看ServiceBean。afterPropertiesSet方法主要是各類屬性設置,包括ProviderConfig、ProtocolConfig、ApplicationConfig、ModuleConfig、registryIds、RegistryConfig、MetadataReportConfig、ConfigCenterConfig、MonitorConfig、MetricsConfig、ProtocolIds、ProtocolConfig、path。spring

ProviderConfig

若是沒有定義ProviderConfig,則設置ProviderConfig和ProtocolConfigsegmentfault

if (getProvider() == null) {
    // 獲取ProviderConfig類型的bean
    Map<String, ProviderConfig> providerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProviderConfig.class, false, false);
    if (providerConfigMap != null && providerConfigMap.size() > 0) {
        // 若是ProviderConfig存在,獲取ProtocolConfig類型的bean
        Map<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);
        if (CollectionUtils.isEmptyMap(protocolConfigMap)
                && providerConfigMap.size() > 1) { // backward compatibility
            // protocolConfigMap爲空,且有多個ProviderConfig的時候,取默認
            List<ProviderConfig> providerConfigs = new ArrayList<ProviderConfig>();
            for (ProviderConfig config : providerConfigMap.values()) {
                if (config.isDefault() != null && config.isDefault()) {
                    providerConfigs.add(config);
                }
            }
            //把多個providerConfigs的值,賦值給ProtocolConfig
            if (!providerConfigs.isEmpty()) {
                setProviders(providerConfigs);
            }
        } else {
            // 這邊只有兩個狀況:protocolConfigMap爲空,providerConfigMap只有一個,或protocolConfigMap不爲空,providerConfigMap有多個
            // 只能有一個默認的providerConfig
            ProviderConfig providerConfig = null;
            for (ProviderConfig config : providerConfigMap.values()) {
                if (config.isDefault() == null || config.isDefault()) {
                    if (providerConfig != null) {
                        throw new IllegalStateException("Duplicate provider configs: " + providerConfig + " and " + config);
                    }
                    providerConfig = config;
                }
            }
            if (providerConfig != null) {
                setProvider(providerConfig);
            }
        }
    }
}

ApplicationConfig

ApplicationConfig沒有設置過,而且ProviderConfig的ApplicationConfig也沒設置過的時候,設置ApplicationConfig,有且只有一個ApplicationConfigapp

if (getApplication() == null
            && (getProvider() == null || getProvider().getApplication() == null)) {
    // 獲取ApplicationConfig類型的bean
    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()) {
            // 只能設置一個ApplicationConfig
            if (applicationConfig != null) {
                throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
            }
            applicationConfig = config;
        }
        if (applicationConfig != null) {
            setApplication(applicationConfig);
        }
    }
}

ModuleConfig

沒有設置過,而且ProviderConfig的ModuleConfig也沒設置過的時候,設置ModuleConfig,有且只有一個ModuleConfigide

if (getModule() == null
            && (getProvider() == null || getProvider().getModule() == null)) {
    // 獲取ModuleConfig類型的bean
    Map<String, ModuleConfig> moduleConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ModuleConfig.class, false, false);
    if (moduleConfigMap != null && moduleConfigMap.size() > 0) {
        ModuleConfig moduleConfig = null;
        for (ModuleConfig config : moduleConfigMap.values()) {
            // // 只能設置一個默認的ModuleConfig
            if (config.isDefault() == null || config.isDefault()) {
                if (moduleConfig != null) {
                    throw new IllegalStateException("Duplicate module configs: " + moduleConfig + " and " + config);
                }
                moduleConfig = config;
            }
        }
        if (moduleConfig != null) {
            setModule(moduleConfig);
        }
    }
}

registryIds

設置registryIds,若是都有值,ProviderConfig會覆蓋ApplicationConfig的registryIdscode

if (StringUtils.isEmpty(getRegistryIds())) {
    if (getApplication() != null && StringUtils.isNotEmpty(getApplication().getRegistryIds())) {
        setRegistryIds(getApplication().getRegistryIds());
    }
    if (getProvider() != null && StringUtils.isNotEmpty(getProvider().getRegistryIds())) {
        setRegistryIds(getProvider().getRegistryIds());
    }
}

RegistryConfig

若是ServiceBean、ProviderConfig、ApplicationConfig都沒有RegistryConfig信息,則經過id從spring容器添加,若是spring容器也沒有對應的id,則加個默認的接口

if ((CollectionUtils.isEmpty(getRegistries()))
            && (getProvider() == null || CollectionUtils.isEmpty(getProvider().getRegistries()))
            && (getApplication() == null || CollectionUtils.isEmpty(getApplication().getRegistries()))) {
    // 獲取RegistryConfig類型的bean
    Map<String, RegistryConfig> registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false);
    if (CollectionUtils.isNotEmptyMap(registryConfigMap)) {
        // 遍歷判斷id,把spring容器的RegistryConfig添加到registryConfigs
        List<RegistryConfig> registryConfigs = new ArrayList<>();
        if (StringUtils.isNotEmpty(registryIds)) {
            Arrays.stream(COMMA_SPLIT_PATTERN.split(registryIds)).forEach(id -> {
                if (registryConfigMap.containsKey(id)) {
                    registryConfigs.add(registryConfigMap.get(id));
                }
            });
        }
        // 若是仍是空,把默認的加入到registryConfigs
        if (registryConfigs.isEmpty()) {
            for (RegistryConfig config : registryConfigMap.values()) {
                if (StringUtils.isEmpty(registryIds) && (config.isDefault() == null || config.isDefault().booleanValue())) {
                    registryConfigs.add(config);
                }
            }
        }
        // 設置到Registries
        if (!registryConfigs.isEmpty()) {
            super.setRegistries(registryConfigs);
        }
    }
}

MetadataReportConfig

if (getMetadataReportConfig() == null) {
    // 獲取MetadataReportConfig類型的bean,只能設置一個
    Map<String, MetadataReportConfig> metadataReportConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MetadataReportConfig.class, false, false);
    if (metadataReportConfigMap != null && metadataReportConfigMap.size() == 1) {
        super.setMetadataReportConfig(metadataReportConfigMap.values().iterator().next());
    } else if (metadataReportConfigMap != null && metadataReportConfigMap.size() > 1) {
        throw new IllegalStateException("Multiple MetadataReport configs: " + metadataReportConfigMap);
    }
}

ConfigCenterConfig

if (getConfigCenter() == null) {
    // 獲取ConfigCenterConfig類型的bean,只能設置一個
    Map<String, ConfigCenterConfig> configenterMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ConfigCenterConfig.class, false, false);
    if (configenterMap != null && configenterMap.size() == 1) {
        super.setConfigCenter(configenterMap.values().iterator().next());
    } else if (configenterMap != null && configenterMap.size() > 1) {
        throw new IllegalStateException("Multiple ConfigCenter found:" + configenterMap);
    }
}

MonitorConfig

if (getMonitor() == null
            && (getProvider() == null || getProvider().getMonitor() == null)
            && (getApplication() == null || getApplication().getMonitor() == null)) {
    // 獲取MonitorConfig類型的bean,只能設置一個默認
    Map<String, MonitorConfig> monitorConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MonitorConfig.class, false, false);
    if (monitorConfigMap != null && monitorConfigMap.size() > 0) {
        MonitorConfig monitorConfig = null;
        for (MonitorConfig config : monitorConfigMap.values()) {
            if (config.isDefault() == null || config.isDefault()) {
                if (monitorConfig != null) {
                    throw new IllegalStateException("Duplicate monitor configs: " + monitorConfig + " and " + config);
                }
                monitorConfig = config;
            }
        }
        if (monitorConfig != null) {
            setMonitor(monitorConfig);
        }
    }
}

MetricsConfig

if (getMetrics() == null) {
    // 獲取MetricsConfig類型的bean,只能設置一個
    Map<String, MetricsConfig> metricsConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MetricsConfig.class, false, false);
    if (metricsConfigMap != null && metricsConfigMap.size() > 0) {
        MetricsConfig metricsConfig = null;
        for (MetricsConfig config : metricsConfigMap.values()) {
            if (metricsConfig != null) {
                throw new IllegalStateException("Duplicate metrics configs: " + metricsConfig + " and " + config);
            }
            metricsConfig = config;
        }
        if (metricsConfig != null) {
            setMetrics(metricsConfig);
        }
    }
}

ProtocolIds

if (StringUtils.isEmpty(getProtocolIds())) {
    if (getProvider() != null && StringUtils.isNotEmpty(getProvider().getProtocolIds())) {
        setProtocolIds(getProvider().getProtocolIds());
    }
}

ProtocolConfig

若是ServiceBean、ProviderConfig都沒有ProtocolConfig信息,則經過id從spring容器添加,若是spring容器也沒有對應的id,則加個默認的ip

if (CollectionUtils.isEmpty(getProtocols())
            && (getProvider() == null || CollectionUtils.isEmpty(getProvider().getProtocols()))) {
    Map<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);
    if (protocolConfigMap != null && protocolConfigMap.size() > 0) {
        List<ProtocolConfig> protocolConfigs = new ArrayList<ProtocolConfig>();
        if (StringUtils.isNotEmpty(getProtocolIds())) {
            Arrays.stream(COMMA_SPLIT_PATTERN.split(getProtocolIds()))
                    .forEach(id -> {
                        if (protocolConfigMap.containsKey(id)) {
                            protocolConfigs.add(protocolConfigMap.get(id));
                        }
                    });
        }
        // 若是仍是空,把默認的加入到protocolConfigs
        if (protocolConfigs.isEmpty()) {
            for (ProtocolConfig config : protocolConfigMap.values()) {
                if (StringUtils.isEmpty(protocolIds)) {
                    protocolConfigs.add(config);
                }
            }
        }

        if (!protocolConfigs.isEmpty()) {
            super.setProtocols(protocolConfigs);
        }
    }
}

path

設置pathget

if (StringUtils.isEmpty(getPath())) {
    if (StringUtils.isNotEmpty(beanName)
            && StringUtils.isNotEmpty(getInterface())
            && beanName.startsWith(getInterface())) {
        setPath(beanName);
    }
}

服務暴露export

supportedApplicationListener在setApplicationContext方法設置的,由於這個類還實現了ApplicationContextAware接口it

if (!supportedApplicationListener) {
    export();
}

後面咱們看看服務是怎麼暴露的io

相關文章
相關標籤/搜索