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 ...
随机推荐
- EXCEL workbook.saveas 函数详解
本问所有资料来自于 Excel2003 VBA帮助文件,张荣整理,适用于DELPHI,VB的高级语言操作Excel用 ExcelApplication.WorkBook.SaveAs(filename ...
- vue生命周期理解图
............................... 它可以总共分为8个阶段: beforeCreate(创建前), created(创建后), beforeMount(载入前), moun ...
- Objective-C中Block的常见用法
typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...
- hive命令的执行方式
1.通过cli直接执行 2.hive -e "hql" 如:[root@host ~]# hive -e "use gamedw;show tables" [r ...
- unzip
中文乱码问题: unzip -O CP936 filename
- kotlin学习(二)——类
Kotlin中的类遵循一个简单的结构.尽管与Java有一点细微的差别.你可以使用try.kotlinlang.org在不需要一个真正的项目和不需要部署到机器的前提下来测试一些简单的代码范例. 1. 怎 ...
- 【JEECG技术文档】表单配置-树形表单
表单配置支持树型表单了,具体效果如下图: 配置说明: 1.是否树:选择是. 2.树形表单父Id:表的自关联外键. 3.树形表单列表:显示树形图标的列,如上图中为[组织机构名称]. 4.默认值:最外层数 ...
- 尚硅谷springboot学习7-yaml配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的: application.properties application.yml 配置文件的作用:修改SpringBoot自动配置的默认值 ...
- cin.tie与sync_with_stdio加速输入输出
在LeetCode上练习习题的时候每次AC之后都会去看别人的代码,几乎每次都能遇到cin.tie与sync_with_stdio.类似这样: static auto x = [](){ std::io ...
- PHP常量总结
概念 常量我们可以理解为值不变的量.常量只要被定义了,在程序脚本的其他任何地方都不能改变. 因为常量被定义后不能被修改,所以即使重定义常量的值,常量的值也是第一次定义常量时的值 常量不管在哪里被定义, ...