一、使用Spring xml配置方式的启动过程

  1. 解析XML,注册Bean

  2. 监听Spring事件

  3. 启动或关闭dubbo

二、详细过程

1. 解析XML,注册Bean

  利用Spring提供的NamespaceHandler扩展机制,META-INF下放两个spring配置文件,

  spring.schemas定义xsd文档位置,spring.handlers定义XML标签对应的Handler。

  spring.schemas内容:

 

  spring.handlers内容:

 

  DubboNamespaceHandler继承NamespaceHandlerSupport(Spring类),并重写了init()方法。

  在init()方法中,注册每个标签对应的解析类(DubboBeanDefinitionParser)。

  

  NamespaceHandlerSupport类中以Map方式存储标签名及对应的解析类;

  

  NamespaceHandlerSupport类中的parse(Element element, ParserContext parserContext)方法,是实际的解析入口,

解析时根据标签名获取对应的parser,然后再调用parser的parse方法(即DubboBeanDefinitionParser中的parse方法)。

  在DubboBeanDefinitionParser的parse方法中,生成BeanDefinition对象,并使用ParserContext中的BeanDefinitionRegistry

注册到spring容器中,参考BeanDefinitionRegistry#registerBeanDefinition(String beanName, BeanDefinition beanDefinition)。

  注意: dubbo的所有bean都是非懒加载的;

      spring中,需要在parser的parse方法中注册bean,spring不负责注册parse方法返回的BeanDefinition。

  另外,关于spring.handlers解析及DubboBeanDefinitionParser的init()方法调用,参考spring的DefaultNamespaceHandlerResolver。

2. 注册监听Spring事件

  dubbo的jar包中,META-INF目录下有一个web-fragment.xml文件(web-fragment工作方式请自行百度)

  

  其关键的内容如下,配置了一个context属性:contextInitializerClasses

  DubboApplicationContextInitializer类源码如下:

  

  可以看到,此处将DubboApplicationListener添加到Spring容器中(即AbstractApplicationContext中的listener列表)

  

  DubboApplicationContextInitializer.initialize()方法在Spring中的执行过程:

    web应用中,我们配置web.xml中的Spring启动监听器:

    

    ContextLoaderListener中,contextInitialized()方法启动Spring容器。

    

    ContextLoaderListener继承了ContextLoader,ContextLoader中customizeContext方法中,

    读取contextInitializerClasses属性执行的class(多个class支持 ,; \t\n 四种分隔符),并调用其initialize()方法。

  接下来看一下DubboApplicationListener内容:

  

  Spring启动完成时,产生ContextRefreshEvent事件,并回调所有listener.

  具体代码在:AbstractApplicationContext.finishRefresh()方法中:

  

   publishEvent()中,再使用SimpleApplicationEventMulticaster.multicastEvent()方法回调所有监听器

  的onApplicationEvent()方法。

  

  

  至此,上述即为dubbo注册即监听Spring的过程。

  另外,如果不是web应用是怎么做的呢?

    Dubbo提供了SpringContainer来启动非web应用,依然是采用Spring注册监听机制

    

3. 启动dubbo

  由DubboBootstrap.start()方法负责。

  

  详细的启动过程下次给出。

本人水平有限,文中有不当之处欢迎评论中指出。

Dubbo启动过程(Spring方式)详解的更多相关文章

  1. Dubbo配置方式详解

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...

  2. [转载,感觉写的非常详细]DUBBO配置方式详解

    [转载,感觉写的非常详细]DUBBO配置方式详解 原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一个分布式服务框架,致力于提供 ...

  3. Spring事务Transaction配置的五种注入方式详解

    Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...

  4. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  5. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  6. Spring Bean 详解

    Spring Bean 详解 Ioc实例化Bean的三种方式 1 创建Bean 1 使用无参构造函数 这也是我们常用的一种.在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象.如果类中没有⽆参构造函 ...

  7. Spring RestTemplate详解

    Spring RestTemplate详解   1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...

  8. Dubbo支持的协议的详解

    Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的.下面我们就针对Dubbo的每种协 ...

  9. 精通Dubbo——Dubbo支持的协议的详解

    转: 精通Dubbo——Dubbo支持的协议的详解 2017年06月02日 22:26:57 孙_悟_空 阅读数:44500   Dubbo支持dubbo.rmi.hessian.http.webse ...

随机推荐

  1. iOS保存gif动态图

    - (void)saveImageToPhotos:(NSData*)gifData { /***注意先倒入库 #import <AssetsLibrary/AssetsLibrary.h> ...

  2. oryx 分离&集成

    公司需要用到在线的流程编辑器,我研究了下activiti,activiti-explorer 是一个 web流程编辑工具,根据我了解到的情况. activiti-explorer web流程编辑工具 ...

  3. rsync 学习

    参考 http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html 模式1 本地直接拷贝, 这个其实是调用了 cp 命令, 跟 rsync ...

  4. spark核心原理

    spark运行结构图如下: spark基本概念 应用程序(application):用户编写的spark应用程序,包含驱动程序(Driver)和分布在集群中多个节点上运行的Executor代码,在执行 ...

  5. stage的划分

    stage的划分是以shuffle操作作为边界的,遇到一个宽依赖就分一个stage 一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage.S ...

  6. js代码执行过程

    一:first-blood:任何程序执行的第一步总是会先检查有没有语法错误,如果有,则直接抛出语法错误,直接跳出, 二:second-blood:预编译,预编译呢会有四个执行过程,1:创建执行期上下文 ...

  7. python大法好——

    1.字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. Python的字符串内建函数 Python 的字符串常用内建函数如下: 1.大小写转换: & ...

  8. web service 部 分

    1 .WEB SERVICE 名 词 解 释 .JSWDL 开 发 包 的 介 绍 .JAXP .JAXM 的 解 释 . SOAP .UDDI,WSDL 解 释 . Web ServiceWeb S ...

  9. 关于 jquery+ajax向asp.net传递json的问题研究(呕心沥血、柳暗花明)

    第一种方法:字典的方法 //质检不合格 $('#Button3').click(function () { if (!confirm('确定质检不合格吗?')) return; var obj = n ...

  10. 结构体中string成员的问题

    在结构体中定义字符串的成员的时候要注意定义成string有时候,在某些程序中给成员赋值会崩溃,但是不确定到底什么情况会崩溃.运行报错如下: Program received signal SIGSEG ...