BeanDefinition
有了,就會建立bean,bean的建立中,提到了若是實現了InitializingBean
接口,就調用他的afterPropertiesSet方法,恰好,上面的bean有兩個是實現了InitializingBean
接口。分佈是ServiceBean
和ReferenceBean
,這邊先看看ServiceBean
。afterPropertiesSet方法主要是各類屬性設置,包括ProviderConfig、ProtocolConfig、ApplicationConfig、ModuleConfig、registryIds、RegistryConfig、MetadataReportConfig、ConfigCenterConfig、MonitorConfig、MetricsConfig、ProtocolIds、ProtocolConfig、path。spring
若是沒有定義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沒有設置過,而且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); } } }
沒有設置過,而且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,若是都有值,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()); } }
若是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); } } }
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); } }
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); } }
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); } } }
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); } } }
if (StringUtils.isEmpty(getProtocolIds())) { if (getProvider() != null && StringUtils.isNotEmpty(getProvider().getProtocolIds())) { setProtocolIds(getProvider().getProtocolIds()); } }
若是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); } } }
設置pathget
if (StringUtils.isEmpty(getPath())) { if (StringUtils.isNotEmpty(beanName) && StringUtils.isNotEmpty(getInterface()) && beanName.startsWith(getInterface())) { setPath(beanName); } }
supportedApplicationListener在setApplicationContext方法設置的,由於這個類還實現了ApplicationContextAware接口it
if (!supportedApplicationListener) { export(); }
後面咱們看看服務是怎麼暴露的io