码迷,mamicode.com
首页 > 编程语言 > 详细

Dubbo启动过程(Spring方式)详解

时间:2018-11-04 21:01:38      阅读:3161      评论:0      收藏:0      [点我收藏+]

标签:完成   efault   目录   zed   xsd   懒加载   finish   四种   com   

一、使用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方式)详解

标签:完成   efault   目录   zed   xsd   懒加载   finish   四种   com   

原文地址:https://www.cnblogs.com/selfchange/p/9905234.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!