日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > Dubbo之旅--啟動解析

Dubbo之旅--啟動解析

來源:程序員人生   發布時間:2015-05-06 08:30:00 閱讀次數:4714次

 

         通過之前系列文章我們已對Dubbo已有了1個整體的印象,接下來我們從其他角度來進1步了解它.Dubbo通過Spring的加載而啟動,本文分析了通過注解方式加載的進程.

 

   1.Schema擴大

 

        通過注解加載dubbo,需要在spring的配置文件中添加:

 

<dubbo:annotationpackage="com.package.to.be.scanned" />

 

dubbo:annotation是dubbo基于spring的schema擴大。

dubbo的schema描寫文件在dubbo-config-spring模塊下。我們可以看到在其中定義的xml描寫信息。

 

        Spring會默許加載spring.handlers和spring.schemas,從而感知schema描寫文檔。從中我們可以看到schema的處理器:com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

 

      DubboNamespaceHandler繼承了NamespaceHandlerSupport。因此不需要實現所有的解析工作,只要將自定義schema中的元素解析器注冊進來就能夠。

 

 

public void init() { 

       registerBeanDefinitionParser("application", newDubboBeanDefinitionParser(ApplicationConfig.class, true)); 

       registerBeanDefinitionParser("module", newDubboBeanDefinitionParser(ModuleConfig.class, true)); 

       registerBeanDefinitionParser("registry", newDubboBeanDefinitionParser(RegistryConfig.class, true)); 

       registerBeanDefinitionParser("monitor", newDubboBeanDefinitionParser(MonitorConfig.class, true)); 

       registerBeanDefinitionParser("provider", newDubboBeanDefinitionParser(ProviderConfig.class, true)); 

       registerBeanDefinitionParser("consumer", newDubboBeanDefinitionParser(ConsumerConfig.class, true)); 

       registerBeanDefinitionParser("protocol", newDubboBeanDefinitionParser(ProtocolConfig.class, true)); 

       registerBeanDefinitionParser("service", newDubboBeanDefinitionParser(ServiceBean.class, true)); 

       registerBeanDefinitionParser("reference", newDubboBeanDefinitionParser(ReferenceBean.class, false)); 

       registerBeanDefinitionParser("annotation", newDubboBeanDefinitionParser(AnnotationBean.class, true)); 

 

        在代碼中我們可以看到被注冊的annotation解析器:DubboBeanDefinitionParser。Parser中的privatestaticBeanDefinition parse()方法實現了解析,并返回解析后生成bean的定義。接下來我們就看1下dubbodubbo:annotation的加載進程。

 

 

 

   2. Dubbo 自定義元素加載

 

       Spring啟動后,加載配置文件信息,得到dubbo的schema元素定義信息:<dubbo:annotation package="com.package.to.be.scanned" />

 

        根據DubboNamespaceHandler中注冊的信息,spring找到解析類并調用解析方法:DubboBeanDefinitionParser.Parse()。

 

第1步,初始化RootBeanDefinition

 

第2步,獲得beanid

 

第3步,將xml中配置的信息放到beandefinition的PropertyValues中。

 

最后返回AnnotationBean的BeanDefinition。

 

至此,annotation對應的bean定義解析終了,spring知曉了AnnotationBean的存在。

 

 

 

   3.  AnnotationBean運行

 

       AnnotationBean實現了很多spring的特殊bean接口:DisposableBean,BeanFactoryPostProcessor,BeanPostProcessor,ApplicationContextAware。這保證AnnotationBean能夠在spring加載的各個時期實現自己的功能。

 

       注解掃描的功能在beanfactory初始化完成調用接口BeanFactoryPostProcessor.postProcessBeanFactory中實現。

 

實現代碼:

 

public voidpostProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 

            throws BeansException { 

        if (annotationPackage == null ||annotationPackage.length() == 0) { 

            return; 

        } 

        if (beanFactory instanceofBeanDefinitionRegistry) { 

            try { 

                // init scanner 

                Class<?> scannerClass =ReflectUtils.forName("org.springframework.context.annotation.ClassPathBeanDefinitionScanner"); 

                Object scanner =scannerClass.getConstructor(new Class<?>[] {BeanDefinitionRegistry.class,boolean.class}).newInstance(new Object[] {(BeanDefinitionRegistry) beanFactory,true}); 

                // add filter 

                Class<?> filterClass =ReflectUtils.forName("org.springframework.core.type.filter.AnnotationTypeFilter"); 

                Object filter =filterClass.getConstructor(Class.class).newInstance(Service.class); 

                Method addIncludeFilter =scannerClass.getMethod("addIncludeFilter",ReflectUtils.forName("org.springframework.core.type.filter.TypeFilter")); 

               addIncludeFilter.invoke(scanner, filter); 

                // scan packages 

                String[] packages =Constants.COMMA_SPLIT_PATTERN.split(annotationPackage); 

                Method scan =scannerClass.getMethod("scan", newClass<?>[]{String[].class}); 

                scan.invoke(scanner, newObject[] {packages}); 

            } catch (Throwable e) { 

                // spring 2.0 

            } 

        } 

 

           AnnotationBean的參數annotationPackage,就是在beandefinition創建時,從xml中讀取到spring中。源碼通過ClassPathBeanDefinitionScanner.doScan掃描annotationPackage下所有的文件。配置成bean的類會定義成BeanDefinition,注冊到spring。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费一二二区视频 | 性一交一乱一乱一视频96 | 精品久久精品 | 激情网站在线 | 曰韩av| 日本一区二区不卡视频 | 国产一二三四区 | 操女人逼网站 | 成人福利影院 | 日韩欧美一区二区视频 | 日韩欧美一级 | 一区二区在线免费 | 国产精品亚洲片在线播放 | 欧美视频不卡 | 成人在线视频免费观看 | 欧美日韩一卡 | 91麻豆精品91久久久久久清纯 | 91久久国产综合久久91精品网站 | 欧美亚洲一区二区三区四区 | avtt在线观看 | 亚洲精品女 | 日韩成人在线播放 | 亚洲国产一区二区三区 | 国产精品xxx在线观看www | 欧美成人精品二区三区99精品 | 国产99精品 | 精品久久精品久久 | 日韩精品一区二区三区中文在线 | 精品少妇一区二区三区视频免付费 | 久久成人国产精品入口 | 青青草亚洲 | 视频在线一区二区 | 自拍偷拍亚洲欧美 | 国产第一页在线 | aaa日本高清在线播放免费观看 | 国产精品一区二区久久久 | 久久久久国产一区二区三区 | 国产乱人乱精一区二视频国产精品 | 黄视频网站在线观看 | 国产欧美精品一区二区色综合 | 一级黄色毛片 |