您好,登錄后才能下訂單哦!
這篇文章主要介紹“dubbo的初始化解析bean的過程是怎樣的”,在日常操作中,相信很多人在dubbo的初始化解析bean的過程是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”dubbo的初始化解析bean的過程是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
解析服務
基于dubbo.jar內(nèi)的META-INF/spring.handlers配置,Spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler。
所有dubbo的標簽,都統(tǒng)一用DubboBeanDefinitionParser進行解析,基于一對一屬性映射,將XML標簽解析為Bean對象。
在ServiceConfig.export()或ReferenceConfig.get()初始化時,將Bean對象轉換URL格式,所有Bean屬性轉成URL的參數(shù)。
然后將URL傳給Protocol擴展點,基于擴展點的Adaptive機制,根據(jù)URL的協(xié)議頭,進行不同協(xié)議的服務暴露或引用。
dubbo服務的暴露調用的是:ServiceConfig.export()代碼如下:
com.alibaba.dubbo.config.ServiceConfig#export
//暴露服務
public synchronized void export() {
if (provider != null) {
if (export == null) {
export = provider.getExport();
}
if (delay == null) {
delay = provider.getDelay();
}
}
if (export != null && ! export.booleanValue()) {
return;
}
if (delay != null && delay > 0) {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(delay);
} catch (Throwable e) {
}
doExport();
}
});
thread.setDaemon(true);
thread.setName("DelayExportServiceThread");
thread.start();
} else {
doExport();
}
}
在查看export調用鏈時,可看到2個地方調用了該方法:
1、com.alibaba.dubbo.config.spring.AnnotationBean#postProcessAfterInitialization:注解的方式暴露時
2、com.alibaba.dubbo.config.spring.ServiceBean#afterPropertiesSet:以spring配置文件暴露時
AnnotationBean類的繼承關系
public class AnnotationBean extends AbstractConfig implements DisposableBean, BeanFactoryPostProcessor, BeanPostProcessor, ApplicationContextAware {
AnnotationBean實現(xiàn)了spring bean和context相關的接口,在spring掃描完注解類,并解析完時調用 export()方法對服務進行暴露
ServiceBean
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener, BeanNameAware {
在spring初始化解析bean完成,主要是在對spring標簽的解析,bean的定義,bean的屬性解析設值等完成后 進行 export()
因為dubbo是自己的自定義標簽,所以對于bean的解析是 export 前最重要的部分,今天先不看服務的暴露,先看dubbo對于服務的解析,重要的兩個類:
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser#parse
以下為DubboNamespaceHandler代碼,加上了我的注釋(自己的理解)
public class DubboNamespaceHandler extends NamespaceHandlerSupport {
static {
/**
* 檢索是否有重復的命名空間處理器
*/
Version.checkDuplicate(DubboNamespaceHandler.class);
}
public void init() {
/**
* 注冊bean,真正負解析的是DubboBeanDefinitionParser
* DubboBeanDefinitionParser將解析所有的屬性,并將屬性值放入BeanDefinition
*/
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
}
}
所有的解析工作都在 DubboBeanDefinitionParser 中;具體可以查看DubboBeanDefinitionParser
解析的最終目的是返回 RootBeanDefinition 對象,RootBeanDefinition包含了解析出來的關于bean的所有信息,注意在bean的解析完后其實只是spring將其轉化成spring內(nèi)部的一種抽象的數(shù)據(jù)對象結構,bean的創(chuàng)建(實例化)是第一次調用 getBean 時創(chuàng)建的。以上是dubbo對配置文件,服務定義的解析過程。后面再寫dubbo服務的暴露。
到此,關于“dubbo的初始化解析bean的過程是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。