溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

dubbo的初始化解析bean的過程是怎樣的

發(fā)布時間:2021-12-15 16:24:08 來源:億速云 閱讀:199 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“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>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI