上篇我们介绍了Dubbbo的SPI机制,地址如下
本文主要针对@Service解析Bean初始化和属性注入,从dubbo源码角度解析。本篇文章内容相对比较简单,所以读者可以轻松愉快阅读。
Dubbo SPI机制,是Dubbo中比较重要的技术手段,也是面试过程中比较常问的技术问题,大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
为了更清楚的分析解释源码,源代码中部分不重要的内容可能会删减,保留重要内容方便大家理解。
Dubbo源码解读-dubbo启动与Spring整合之@ DubboComponentScan-CSDN博客本文中有介绍依赖的Spring基础知识,感兴趣的同学可以看一下。
- public void afterPropertiesSet() throws Exception {
- //ProviderConfig配置处理
- if (getProvider() == null) {
- Map
providerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProviderConfig.class, false, false); - if (providerConfigMap != null && providerConfigMap.size() > 0) {
- Map
protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false); - if ((protocolConfigMap == null || protocolConfigMap.size() == 0)
- && providerConfigMap.size() > 1) { // backward compatibility
- List
providerConfigs = new ArrayList(); - for (ProviderConfig config : providerConfigMap.values()) {
- if (config.isDefault() != null && config.isDefault().booleanValue()) {
- providerConfigs.add(config);
- }
- }
- if (!providerConfigs.isEmpty()) {
- setProviders(providerConfigs);
- }
- } else {
- ProviderConfig providerConfig = null;
- for (ProviderConfig config : providerConfigMap.values()) {
- if (config.isDefault() == null || config.isDefault().booleanValue()) {
- if (providerConfig != null) {
- throw new IllegalStateException("Duplicate provider configs: " + providerConfig + " and " + config);
- }
- providerConfig = config;
- }
- }
- if (providerConfig != null) {
- setProvider(providerConfig);
- }
- }
- }
- }
- //ApplicationConfig配置处理
- if (getApplication() == null
- && (getProvider() == null || getProvider().getApplication() == null)) {
- 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) {
- setApplication(applicationConfig);
- }
- }
- }
- //ModuleConfig配置处理
- if (getModule() == null
- && (getProvider() == null || getProvider().getModule() == null)) {
- Map
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()) {
- if (config.isDefault() == null || config.isDefault().booleanValue()) {
- if (moduleConfig != null) {
- throw new IllegalStateException("Duplicate module configs: " + moduleConfig + " and " + config);
- }
- moduleConfig = config;
- }
- }
- if (moduleConfig != null) {
- setModule(moduleConfig);
- }
- }
- }
- //Registries多注册中心处理
- if ((getRegistries() == null || getRegistries().isEmpty())
- && (getProvider() == null || getProvider().getRegistries() == null || getProvider().getRegistries().isEmpty())
- && (getApplication() == null || getApplication().getRegistries() == null || getApplication().getRegistries().isEmpty())) {
- Map
registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false); - if (registryConfigMap != null && registryConfigMap.size() > 0) {
- List
registryConfigs = new ArrayList(); - for (RegistryConfig config : registryConfigMap.values()) {
- if (config.isDefault() == null || config.isDefault().booleanValue()) {
- registryConfigs.add(config);
- }
- }
- if (registryConfigs != null && !registryConfigs.isEmpty()) {
- super.setRegistries(registryConfigs);
- }
- }
- }
- //Monitor监控配置处理
- if (getMonitor() == null
- && (getProvider() == null || getProvider().getMonitor() == null)
- && (getApplication() == null || getApplication().getMonitor() == null)) {
- Map
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().booleanValue()) {
- if (monitorConfig != null) {
- throw new IllegalStateException("Duplicate monitor configs: " + monitorConfig + " and " + config);
- }
- monitorConfig = config;
- }
- }
- if (monitorConfig != null) {
- setMonitor(monitorConfig);
- }
- }
- }
- //Protocols 协议配置处理
- if ((getProtocols() == null || getProtocols().isEmpty())
- && (getProvider() == null || getProvider().getProtocols() == null || getProvider().getProtocols().isEmpty())) {
- Map
protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false); - if (protocolConfigMap != null && protocolConfigMap.size() > 0) {
- List
protocolConfigs = new ArrayList(); - for (ProtocolConfig config : protocolConfigMap.values()) {
- if (config.isDefault() == null || config.isDefault().booleanValue()) {
- protocolConfigs.add(config);
- }
- }
- if (protocolConfigs != null && !protocolConfigs.isEmpty()) {
- super.setProtocols(protocolConfigs);
- }
- }
- }
- if (getPath() == null || getPath().length() == 0) {
- if (beanName != null && beanName.length() > 0
- && getInterface() != null && getInterface().length() > 0
- && beanName.startsWith(getInterface())) {
- setPath(beanName);
- }
- }
- //是否延迟发布
- if (!isDelay()) {
- export();
- }
- }
总结:上面内容中,源码角度进行了详细分析,依赖的Spring源码知识点也做了说明,如果大家有疑问或者对文章排版任何方面有建议都可以留言评论,看到都会及时回复大家。
知识总结,分享不易,全文手敲,欢迎大家点赞评论收藏。