本原始碼版本為2.6.7
比如有以下配置
dubbo提供的標籤解析的命名空間為dubbobeandefinitionparser
@override
public void init()
解析方法
public beandefinition com.alibaba.dubbo.config.spring.schema.dubbobeandefinitionparser#parse(element element, parsercontext parsercontext) |v
private static beandefinition com.alibaba.dubbo.config.spring.schema.dubbobeandefinitionparser#parse(element element, parsercontext parsercontext, class<?> beanclass, boolean required) else
}if (generatedbeanname == null || generatedbeanname.length() == 0)
id = generatedbeanname;
int counter = 2;
//是否已經包含這個beanname,包含的進行遞增計數
while (parsercontext.getregistry().containsbeandefinition(id))
}if (id != null && id.length() > 0)
//註冊這個beandefinition
parsercontext.getregistry().registerbeandefinition(id, beandefinition);
//設定這個beanname到對應的bean中
beandefinition.getpropertyvalues().addpropertyvalue("id", id);
}//上面是公用方法設定,我感覺可以單獨抽成乙個方法
//下面是針對不同標籤的特殊解析
//解析protocol標籤時進入
if (protocolconfig.class.equals(beanclass)) }}
//解析service標籤時會進入這個方法
} else if (servicebean.class.equals(beanclass))
//內部可以配置多個service標籤,provider標籤提供內部多個提供者的預設配置
} else if (providerconfig.class.equals(beanclass)) else if (consumerconfig.class.equals(beanclass))
setprops = new hashset();
managedmap parameters = null;
for (method setter : beanclass.getmethods()) catch (nosuchmethodexception e) catch (nosuchmethodexception e2)
}//忽略不是public或者型別不和setter引數匹配的方法
if (getter == null
|| !modifier.ispublic(getter.getmodifiers())
|| !type.equals(getter.getreturntype()))
//屬性名為parameters,解析
//如果hide屬性為true,那麼在put到parameters的時候會在key前面新增.號
if ("parameters".equals(property)) else if ("methods".equals(property)) else if ("arguments".equals(property)) else else if ("registry".equals(property) && value.indexof(',') != -1) else if ("provider".equals(property) && value.indexof(',') != -1) else if ("protocol".equals(property) && value.indexof(',') != -1) else
reference = value;
//協議屬性
} else if ("protocol".equals(property)
//檢查是否存在protocol介面的實現,dubbo通過@spi來獲取實現類,這個value此時表示spi的副檔名
//檢視protocol介面,可以看到介面被@spi註解修飾,預設的擴充套件名為dubbo
&& extensionloader.getextensionloader(protocol.class).ha***tension(value)
//不包含或者包含的對應bean不是protocolconfig
&& (!parsercontext.getregistry().containsbeandefinition(value)
|| !protocolconfig.class.getname().equals(parsercontext.getregistry().getbeandefinition(value).getbeanclassname())))
// backward compatibility
//因為上面檢測不存在value指定的protocolconfig,那麼為了向後相容,就建立乙個
protocolconfig protocol = new protocolconfig();
protocol.setname(value);
reference = protocol;
//返回時呼叫方法
} else if ("onreturn".equals(property)) else if ("onthrow".equals(property)) else if ("oninvoke".equals(property)) else
}reference = new runtimebeanreference(value);
}//設定應用
beandefinition.getpropertyvalues().addpropertyvalue(propertyname, reference);}}
}}}}
//處理沒有getter方法的屬性,這些屬性都被認為是自定義屬性
namednodemap attributes = element.getattributes();
int len = attributes.getlength();
for (int i = 0; i < len; i++)
string value = node.getnodevalue();
parameters.put(name, new typedstrin**alue(value, string.class));}}
if (parameters != null)
return beandefinition;
}//(*1*)
//element, parsercontext, servicebean.class, true, "service", "provider", id, beandefinition
private static void parsenested(element element, parsercontext parsercontext, class<?> beanclass, boolean required, string tag, string property, string ref, beandefinition beandefinition)
}//遞迴呼叫dubbobeandefinitionparser的parse,繼續解析service標籤
beandefinition subdefinition = parse((element) node, parsercontext, beanclass, required);
if (subdefinition != null && ref != null && ref.length() > 0) }}
}}
}//(*2*)
//element, parsercontext, referencebean.class, false, "reference", "consumer", id, beandefinition
private static void parsenested(element element, parsercontext parsercontext, class<?> beanclass, boolean required, string tag, string property, string ref, beandefinition beandefinition)
}//建立referencebean物件
beandefinition subdefinition = parse((element) node, parsercontext, beanclass, required);
if (subdefinition != null && ref != null && ref.length() > 0) }}
}}
}
dubbo的標籤解析就到這裡就結束了,接下來就是具體分析配置類了 1 Dubbo實現SPI之 JDK介紹
jdk通過serviceloader類實現spi機制的服務查詢功能。我們來看下jdk是如何實現 jdk實現spi服務查詢 serviceloader。package com.test public inte ce spi string sayhello serviceloader會遍歷所有jar查詢...
dubbo 配置解析
1.dubbo 常用配置 服務配置,用於暴露乙個服務,定義服務的元資訊,乙個服務可以用多個協議暴露,乙個服務也可以註冊到多個註冊中心。eg 引用服務配置,用於建立乙個遠端服務 乙個引用可以指向多個註冊中心。eg 協議配置,用於配置提供服務的協議資訊,協議由提供方指定,消費方被動接受。eg 模組配置,...
dubbo原理之標籤解析
前言 dubbo的標籤解析作為dubbo的入口,結合spring容器的一小小部分的流程,讓大家了解以下dubbo的服務提供者在將服務暴露之前,經歷了哪些過程。標籤解析主要是spring的原始碼部分,spring原始碼加註解部分我也上傳github了 5.0.x分支。下邊是偽 想除錯的也可以按照下面的...