1 dubbo配置標籤的解析

2021-09-26 18:36:25 字數 4715 閱讀 5959

本原始碼版本為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分支。下邊是偽 想除錯的也可以按照下面的...