大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Dubbo源碼解析:標(biāo)簽分析

Dubbo源碼解析:標(biāo)簽分析

更新時(shí)間:2022-03-18 12:18:03 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2235次

1.Dubbo配置方法

Dubbo支持多種配置:

XML配置:基于Spring的Schema和XML擴(kuò)展機(jī)制實(shí)現(xiàn)

屬性配置:加載ClassPath根目錄下的Dubbo.Properties

API配置:硬編碼方式配置(不推薦)

注意配置:通過注解配置(Dubbo-2.5.7及以上,不推薦)

對(duì)于Property的配置方式,可以通過環(huán)境變量指定, -d 啟動(dòng)參數(shù)dubbo.properties文件,加載文件的順序?yàn)椋?/p>

-D 啟動(dòng)參數(shù)

環(huán)境變量

類路徑根目錄

加載代碼如下:

public  static  final String DUBBO_PROPERTIES_KEY = "dubbo.properties.file" ;
public  static  final String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties" ;
私有 靜態(tài) 易失性屬性屬性;
公共 靜態(tài)屬性 getProperties() {
     if (PROPERTIES == null ) {
        同步(ConfigUtils.class ) {
             if ( PROPERTIES == null ) {
                字符串路徑= System.getProperty(Constants.DUBBO_PROPERTIES_KEY);
                if (path == null || path.length() == 0 ) {
                    路徑= System.getenv(Constants.DUBBO_PROPERTIES_KEY);
                    if (path == null || path.length() == 0 ) {
                        路徑=常量.DEFAULT_DUBBO_PROPERTIES;
                    }
                }
                屬性= ConfigUtils.loadProperties(路徑,假,真);
            }
        }
    }
    返回屬性;
}

本文主要分析XML配置的實(shí)現(xiàn)原理和源碼,其他方法不再贅述。

2.XML配置

文章開頭已經(jīng)提到XML配置是基于Spring-based Schema和XML擴(kuò)展來實(shí)現(xiàn)的。通過這種機(jī)制,我們可以編寫自己的模式,并根據(jù)自定義的 SCHEMA 自定義標(biāo)簽配置 bean。

使用 XML 擴(kuò)展機(jī)制有幾個(gè)步驟:

定義架構(gòu)(編寫 .xsd 文件)

定義 Javabean

編寫 NamespaceHandler 和 BeandefinitionParser 完成 SCHEMA 分析

編寫 Spring.Handlers 和 Spring.Schemas 文件系列解析部分

XML 文件中的應(yīng)用程序配置

Dubbo-Config 模塊中的 Dubbo 配置相關(guān)代碼。

(1)定義模式

Schema的定義體現(xiàn)在.xsd文件中,該文件位于Dubbo-Config-Spring子模塊下:

至于XSD的數(shù)據(jù)類型,如何定義,不是本文的重點(diǎn)。

(2)定義Javabean

Dubbo-Config-API子模塊定義了JavaBean的所有配置項(xiàng),JavaBean中JavaBean的屬性,在Dubbo-Config-API子模塊中定義。

(3)SCHEMA分析

Dubbo 服務(wù)框架的 SCHEMA 由 DubbonamespaceHandler 和 DubbobeandefinitionParser 實(shí)現(xiàn)。

其中,DubboNamespaceHandler擴(kuò)展了 Spring 的 NamespaceHandler 支持,并通過重寫其 INIT() 方法注冊(cè)相應(yīng)的解析器:

公共 類DubboNamespaceHandler擴(kuò)展NamespaceHandlerSupport {
    靜態(tài){Version.checkDuplicate 
        (DubboNamespaceHandler.class );
    }
    公共 無效初始化(){
        registerBeanDefinitionParser( "應(yīng)用程序" , new DubboBeanDefinitionParser(ApplicationConfig.class , true ) );
        registerBeanDefinitionParser( "module" , new DubboBeanDefinitionParser(ModuleConfig.class , true ) );
        registerBeanDefinitionParser( "注冊(cè)表" , 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實(shí)現(xiàn)了 Spring 的 beandefinitionParser,通過覆蓋 parse() 方法將標(biāo)簽解析為對(duì)應(yīng)的 JavaBean:

公共 類DubboBeanDefinitionParser實(shí)現(xiàn)BeanDefinitionParser {
     public BeanDefinition parse(Element element, ParserContext parserContext) {
     return parse(element, parserContext, beanClass, required);
    }
    @SuppressWarnings( "unchecked" )
     private  static BeanDefinition parse(Element element,ParserContext parserContext,Class<?> beanClass, boolean required) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(beanClass);
        beanDefinition.setLazyInit( false );
        // ...... 省略
        if (ProtocolConfig.class .equals(beanClass)) {
             for (String name : parserContext.getRegistry().getBeanDefinitionNames()) {
                BeanDefinition 定義= parserContext.getRegistry().getBeanDefinition(name);
                PropertyValue 屬性= definition.getPropertyValues().getPropertyValue("protocol" );
                如果(屬性!= null ){
                    對(duì)象值= property.getValue();
                    if (value instanceof ProtocolConfig && id.equals(((ProtocolConfig) value).getName())) {
                        definition.getPropertyValues().addPropertyValue( "protocol", new RuntimeBeanReference(id));
                    }
                }
            }
        } else  if (ServiceBean.class .equals (beanClass)) {
            String className = element.getAttribute("class" );
            if (className != null && className.length() > 0 ) {
                RootBeanDefinition classDefinition = new RootBeanDefinition();
                classDefinition.setBeanClass(ReflectUtils.forName(className));
                classDefinition.setLazyInit( false );
                parseProperties(element.getChildNodes(), classDefinition);
                beanDefinition.getPropertyValues().addPropertyValue( "ref", new BeanDefinitionHolder(classDefinition, id + "Impl" ));
            }
        } else  if (ProviderConfig.class .equals (beanClass)) {
            parseNested(element, parserContext, ServiceBean.class , true , "service", "provider" , id, beanDefinition);
        } else  if (ConsumerConfig.class .equals (beanClass)) {
            parseNested(element, parserContext, ReferenceBean.class , false , "reference", "consumer" , id, beanDefinition);
        }
        // ...... 省略
        return beanDefinition;
    }
}

(4)系列組件

上面我們已經(jīng)知道了解析實(shí)現(xiàn)類,那么Spring怎么知道DubbonamespaceHandler是解析Dubbo標(biāo)簽的呢?這是編寫spring.handlers文件的實(shí)現(xiàn)。

Spring.handlers 內(nèi)容如下:

http\: // code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

然后 Spring的spring.schemas文件得知 Dubbo 標(biāo)簽的 Schema 為 Dubbo.xsd,并以此驗(yàn)證 XML 配置文件的格式。

Spring.schemas 文件內(nèi)容如下:

http\: // code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd

文件位置如下:

(5)應(yīng)用配置

通過以上步驟,Dubbo服務(wù)框架完成了標(biāo)簽的功能,用戶可以在 Dubbo.xsd 中的應(yīng)用程序中配置 XML。

提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久9966e这里只有精品 | 成人区精品一区二区不卡亚洲 | 久久国产亚洲精品 | 亚洲综合激情六月婷婷在线观看 | 亚洲色婷婷综合开心网 | 久久综合九色综合91 | 亚洲综合激情另类图片专区 | 久久精品国产清白在天天线 | 四虎影视色费永久在线观看 | 欧美午夜视频一区二区三区 | 国产91在线九色 | 久久精品欧美日韩精品 | 精品国产高清a毛片无毒不卡 | 久久免费视频99 | 久草新免费 | 极品美女aⅴ高清在线观看 极品美女一级毛片 | 中文字幕色婷婷在线精品中 | 国产亚洲欧美一区二区 | 日韩欧美在线观看视频一区二区 | 久久一本精品久久精品66 | 欧美成人一区二区三区不卡视频 | 99精品在线 | 国产99网站| 日本一区不卡视频 | 久色亚洲 | 天天操天天射天天 | 亚洲精品一区二区在线播放 | 日本护士一级毛片在线播放 | 久色国产 | www.夜夜| 欧美一级毛片生活片 | 欧美影院一区 | 国产精品一区不卡 | 久草久在线 | 国产成人精品综合久久久 | 国产资源在线播放 | 国产成人一区二区 | 国产玖玖在线观看 | 一级毛片免费毛片一级毛片免费 | 91最新免费地址入口 | 亚洲乱亚洲乱妇无码 |