關於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環境中的虛擬交換,除了開放標準的控制和視覺化介面給虛擬網路層,它還支援跨多個物理伺...