Motan 通过配置文件 启动分析

2016-10-29  本文已影响0人  _流浪的猫_

通过配置文件XML启动,入口处理也是AbstractApplicationContext类中的refresh方法,但xml是在这个调用中处理的ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();如doLoadDocument和registerBeanDefinitions。核心处理在XmlBeanDefinitionReader类的doLoadBeanDefinitions方法中,该方法也就两个函数调用,先加载XML,然后注册bean。

doLoadDocument方法,将xml加载到内存中,转换为Document对象的示例,fNodeValue存放这节点的值,如下图:(可以看到Motan的一些节点值)


nodevalue.png

doLoadBeanDefinitions方法,功能就是将xml描述的bean注册到上下文中。继续往里查看代码,一个核心处理在DefaultBeanDefinitionDocumentReader类的parseBeanDefinitions方法处:

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
  if (delegate.isDefaultNamespace(root)) {
   NodeList nl = root.getChildNodes();
   for (int i = 0; i < nl.getLength(); i++) {
    Node node = nl.item(i);
    if (node instanceof Element) {
     Element ele = (Element) node;
     if (delegate.isDefaultNamespace(ele)) {
       // 处理 spring 默认的命名空间的元素,就是xml头上spring自己的一些东西
      parseDefaultElement(ele, delegate);
     }
     else {
      // 处理自定义的元素
      delegate.parseCustomElement(ele);
     }
    }
   }
  }
  else {
   delegate.parseCustomElement(root);
  }
 }

parseCustomElement方法主要处理:

// handlerMappingsLocation值:META-INF/spring.handlers,spring遍历查找各个工程或包找这个文件,并获取其值
Properties mappings =
        PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);

后面是实例化、初始化等等各种bean的操作了,与注解的处理还不一样。


ServiceConfigBeanbean实现了下面几个接口

// 为了让serviceBean最早加载
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

serviceBean 实现 InitializingBean接口,在afterPropertiesSet方法中创建必要的bean:
1、创建serviceBasicConfig的实例(getBean方法)

2、创建协议bean

3、最后再检查RegistryConfig,以防意外缺少注册中心配置(该配置在第一步中创建过)


从上面来看,要扩展spring xml语法,需要下面几个步骤

上一篇下一篇

猜你喜欢

热点阅读