原文鏈接:http://blog.csdn.net/achilles12345/article/details/41789527
----------------------------------------------------------------------------------------------
? 作為一個分布式服務治理框架,dubbo做的非常好,在業界使用很廣,所以最近研究了下這個框架。任何框架要研究其原理最好的辦法之一就是沿著其運行流程進行追蹤,這樣就能從上到下,從粗到細對一個系統進行了解。今天,我們要說明的問題就是dubbo如何啟動的。
? ? ? ? dubbo是基于Spring進行開發的,而且擴展了Spring的XML schema和注解標簽,其實這里也就是整個dubbo的切入點。dubbo除去依賴其他的第三方框架外,整個框架只有一個jar包,可謂是精致。在這個jar包的NET-INF目錄下有兩個文件:spring.handlers和spring.schemas。其中spring.schemas中定義的就是擴展的spring配置標簽,而且spring.handlers中定義的就是這些schema的處理類,就是這個類將dubbo組件“插入”到spring這個平臺里的。(關于如何自定義spring配置的schema,網上資料很多,這里只簡單概括)Spring在啟動的時候會掃描MET-INF下所有的spring.handlers等文件,找到其中的標簽處理類,并運行其init方法。
? ? ? ? 這里要插個知識點“spring的啟動過程”。spring啟動過程,從宏觀角度來講分為兩個階段。第一個階段完成spring配置文件的解析,或者spring注解的解析最終將這些配置或者注解解析成BeanDefinition對象,然后進入下一個階段,比如我們經常在spring配置文件中使用的占位符替換工作就是在這個階段完成的。在第二個階段中,spring用之前解析好的BeanDefinition對象來完成bean的初始化和組裝工作,比如我們使用spring事務時的事務proxy就是這個階段完成注入到service對象中的。
? 在這個init方法中,dubbo將自己的標簽(application,module,registry,monitor,provider,consumer,protocol,service,reference)處理類注冊到spring中,而這些類會完成對自己所負責的標簽的解析工作,將標簽最終轉換為bean的描述對象BeanDefinition并返回給spring,而spring拿到這些標簽對象完成bean的初始化、依賴注入(比如注入對RMI端的proxy對象)。
這就是dubbo的宏觀啟動流程,這個對于理解dubbo框架的原理能起到促進作用,網上也沒有明確的文章進行說明,這里做個補充。希望能幫大家解決一些問題。