Dubbo原始碼分析之一 spring整合之xml

2021-07-11 18:12:01 字數 3567 閱讀 9935

關於dubbo與spring 的整合有倆種方式:xml配置檔案,註解。相關**主要集中在dubbo-config-spring 包中。

xml配置檔案方式的處理

spring 在啟動時,找到dubbo命名空間的處理類。

meta-inf/spring.handlers

內容http\:

public class dubbonamespacehandler extends namespacehandlersupport 

public void init()

}

所有元素的解析器都為dubbobeandefinitionparser ,實現了spring  的 beandefinitionparser介面

這裡要吐槽一下,所有的解析都在乙個方法中,有點亂!

public dubbobeandefinitionparser(class<?> beanclass, boolean required) 

// 最終的解析方法

// element xml元素

// parsercontext 解析上下文

// beanclass element對應的class

// required 是否必須

private static beandefinition parse(element element, parsercontext parsercontext, class<?> beanclass, boolean required) else

}if (generatedbeanname == null || generatedbeanname.length() == 0)

id = generatedbeanname;

int counter = 2;

while(parsercontext.getregistry().containsbeandefinition(id))

}if (id != null && id.length() > 0)

parsercontext.getregistry().registerbeandefinition(id, beandefinition); // 注入spring

beandefinition.getpropertyvalues().addpropertyvalue("id", id);

}if (protocolconfig.class.equals(beanclass)) }}

} else if (servicebean.class.equals(beanclass))

} 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)

}if (getter == null

|| ! modifier.ispublic(getter.getmodifiers())

|| ! type.equals(getter.getreturntype()))

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)

&& extensionloader.getextensionloader(protocol.class).ha***tension(value)

&& (! parsercontext.getregistry().containsbeandefinition(value)

|| ! protocolconfig.class.getname().equals(parsercontext.getregistry().getbeandefinition(value).getbeanclassname())))       

// 相容舊版本配置                         

protocolconfig protocol = new protocolconfig();

protocol.setname(value);    

reference = protocol;  

} else if ("monitor".equals(property)

&& (! parsercontext.getregistry().containsbeandefinition(value)

|| ! monitorconfig.class.getname().equals(parsercontext.getregistry().getbeandefinition(value).getbeanclassname()))) else if ("onreturn".equals(property)) else if ("onthrow".equals(property)) else

} reference = new runtimebeanreference(value);

}beandefinition.getpropertyvalues().addpropertyvalue(property, reference);}}

}}}}

// 將節點中的屬性,全部設定到beandefinition中

namednodemap attributes = element.getattributes();

int len = attributes.getlength();      

for (int i = 0; i < len; i++)                

string value = node.getnodevalue();              

parameters.put(name, new typedstringvalue(value, string.class));            }        }       

if (parameters != null)        

return beandefinition;  

}

Dubbo原始碼分析

dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...

lighttpd 原始碼分析之一 server c

基於lighttpd 1.4.26。在src資料夾下共有137個檔案,程式的入口在server.c中。在server.c的最開頭地方引用了 server.h檔案,如下所示 目前還沒有讀到的就先不介紹了,其中在.h檔案中用得最多的是 ifndef define endif 主要是防止重複定義,一般會緊...

OpenVswitch原始碼分析之一 背景

open vswitch是基於開源apache 2 license的多層軟體交換機,其目的是實現乙個產品級質量的交換平台,其支援標準的管理介面,並開放 功能介面供程式設計擴充套件和控制。open vswitch適於vm環境中的虛擬交換,除了開放標準的控制和視覺化介面給虛擬網路層,它還支援跨多個物理伺...