dubbo学习(二)-dubbo与spring的整合及启动顺序

  1. Spring 基于Schema扩展


    由于xml格式具有很好的自说明便于编写及维护,Spring中bean的定义主要是通过xml形式。而对于xml的文档结构、数据定义及格式验证则是采用Schema。使用Schema方式使得spring更加便于与第三方进行集成以及第三方可以提供更简单更便于使用的个性化配置方式。对于XmlSchema具体知识这里不做介绍,但是Schema中有个重要的概念命名空间(namespace)必须要提一下,spring就是利用它来做第三方自定配置格式的解析的,在spring中aop, transaction的就是给第三一个实现自己自定义配置很好实例。
    命名空间
    Schema中有个重要的概念:命名空间(namespace),spring就是利用它来做第三方自定配置格式的解析的。
      
    如上图:xmlns=”http://www.springframework.org/schema/beans”是默认命名空间

    xmlns:aop=”http://www.springframework.org/schema/aop” 定义了aop的命名空间

    而各命名空间下的格式定义文件通过xsi:schemaLocation来指定。

    当spring启动时,会把xml配置文件当做一个文档格式来读取,每读取一个元素节点都会判断下这个元素的命名空间,如果是默认命名空间(http://www.springframework.org/schema/beans)则按默认方式读取bean的定义, 如果不是如namespaceUri如下

    http://www.springframework.org/schema/aop,

    http://www.springframework.org/schema/tx,

    则走解析自定义元素流程。根据命名空间去获取具体的处理器NamespaceHandler。那具体的处理器是在哪定义的呢,在”META-INF/spring.handlers”文件中,Spring在会自动加载该文件中所有内容。
     

  2. dubbo与spring的整合



    如上2图,dubbo指定了DubboNamespaceHandler类来处理dubbo命名空间对应的元素。

    DubboNamespaceHandler中注册了这么多的BeanDefinitionParser用来解析dubbo定义的那些xml元素节点如:

    <dubbo:application />

    <dubbo:registry />

    <dubbo:reference />

    <dubbo:service />

    各个BeanDefinitionParser会把上面的xml元素转换成spring内部的数据结构BeanDefinition,最终当被引用时实例化成对应的bean。
    如<dubbo:application/>节点最终会得到ApplicationConfig类.


  3. dubbo的启动顺序

    Main类中首先会实例化一个ExtensionLoader<Container>类型的容器加载器,同时会加载Container接口的所有可用扩展点。
    Main.main()

    if (args == null || args.length == 0) {
                   String config = ConfigUtils.getProperty(CONTAINER_KEY, loader.getDefaultExtensionName());
                   args = Constants.COMMA_SPLIT_PATTERN.split(config);
               }
               final List<Container> containers = new ArrayList<Container>();
               for (int i = 0; i < args.length; i ++) {
                   containers.add(loader.getExtension(args[i]));
               }
    …..
    for (Container container : containers) {
                  container.start();
                  logger.info("Dubbo " + container.getClass().getSimpleName() + " started!");
              }
    SpringContainer.start()
     String configPath = ConfigUtils.getProperty(SPRING_CONFIG);
            if (configPath == null || configPath.length() == 0) {
                configPath = DEFAULT_SPRING_CONFIG;
            }
            context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"));
            context.start();



    然后在main()方法中会根据 main方法参数>配置文件>SPI注解默认值的优先级顺序获取到所需的扩展点并启动,由于初始任务主要在Spring中完成,所以我们只关注SpringContainer的启动即可。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值