Dubbo启动过程(Spring方式)详解
一、使用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方式)详解的更多相关文章
- Dubbo配置方式详解
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...
- [转载,感觉写的非常详细]DUBBO配置方式详解
[转载,感觉写的非常详细]DUBBO配置方式详解 原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一个分布式服务框架,致力于提供 ...
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
- 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理
Spring AOP详解 . JDK动态代理.CGLib动态代理 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- Spring Bean 详解
Spring Bean 详解 Ioc实例化Bean的三种方式 1 创建Bean 1 使用无参构造函数 这也是我们常用的一种.在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象.如果类中没有⽆参构造函 ...
- Spring RestTemplate详解
Spring RestTemplate详解 1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...
- Dubbo支持的协议的详解
Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的.下面我们就针对Dubbo的每种协 ...
- 精通Dubbo——Dubbo支持的协议的详解
转: 精通Dubbo——Dubbo支持的协议的详解 2017年06月02日 22:26:57 孙_悟_空 阅读数:44500 Dubbo支持dubbo.rmi.hessian.http.webse ...
随机推荐
- asp 月末 月初
上个月第一天:<%=dateadd("m",-1,year(date)&"-"&month(date)&"-1" ...
- spring 之 lookup-method & replace-method
初始化bean的堆栈: at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy$Cglib ...
- eclipse中无法新建Android工程 出现问题:Plug-in org.eclipse.ajdt.ui was unable to load
转自:http://www.bubuko.com/infodetail-757338.html eclipse中打开后新建Android项目区仍无法创建,出现下列提示对话框: Plug-in org. ...
- Proftpd 服务器安装配置
yum install proftpd 如果提示没有找到源 rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6 ...
- 机器学习进阶-图像形态学操作-开运算与闭运算 1.cv2.morphologyEx(进行各类形态学变化) 2.op=cv2.MORPH_OPEN(先腐蚀后膨胀) 3.op=cv2.MORPH_CLOSE(先膨胀后腐蚀)
1.cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化 参数说明:src传入的图片,op进行变化的方式, kernel表示方框的大小 2.op = cv2.MO ...
- flash推流工具<转>
https://github.com/young-cowboy/young-cowboy.github.io https://www.cnblogs.com/xiaoniuzai/p/7129036. ...
- LeetCode题解:Flatten Binary Tree to Linked List:别人的递归!
总是在看完别人的代码之后,才发现自己的差距! 我的递归: 先把左侧扁平化,再把右侧扁平化. 然后找到左侧最后一个节点,把右侧移动过去. 然后把左侧整体移到右侧,左侧置为空. 很复杂吧! 如果节点很长的 ...
- cxGrid 颜色设置
一.cxGrid 根据列值变色(样式) 在使用cxGrid的过程中,某一个单元格经常需要根据其他单元格的值来做相应的变色,如: 在cxGridDBTableView中,选定要变样式(如背景色.字体属性 ...
- Ftp命令使用
FTP> ? 显示 ftp 命令说明.? 与 help 相同. 格式:? [command] 说明:[command] 指定需要帮助的命令名称.如果没有指定 command,ftp将显示全部命 ...
- servlet编码问题
建议每个servlet都写上 request.setCharacterEncoding("UTF-8")