xml加载Spring容器会先通过ClassPathXmlApplicationContext的构造方法里面:
    1. 通过 setConfigLocations 方法去创建解析器,解析configLocations(就是加载resources目录下的Spring.xml配置文件,文件名和路径名是可以自由配置的,这里可以加载多个Spring.xml,也可以模糊匹配路径).

    2. 然后会走refresh()方法初始化Spring容器, 在内部会创建BeanFactory(
    在AbstractRefreshableApplicationContext抽象类里面的refreshBeanFactory()方法里面创建BeanFactory, 创建之前会先判断BeanFactory是否为空,如果不为空就清除BeanFactor里面的所有实例,
    如果为空就new 一个 DefaultListableBeanFactory,此时会在DefaultSingletonBeanRegistry里面初始化bean的单例缓存容器等等一系列的容器,
    )
    然后继续执行AbstractRefreshableApplicationContext#refreshBeanFactory()方法内部的loadBeanDefinitions()方法,

    方法内部实例化XmlBeanDefinitionReader对象解析一个数组,这个数组存放着xml文件,因为Spring xml文件可能会有多个.


    此时方法是解析xml对象的,并且把xml中的标签封装成BeanDefinition对象(在方法内部通过Resource对象读取xml,然后在通过InputStream读取Resources对象里面的xml对象,再然后把这个input流封装成Document对象然后进行解析里面的值(XmlBeanDefinitionReader#doLoadDocument 这个方法将xml的Resources资源封装成Document对象)

    然后在DefaultBeanDefinitionDocumentReader#parseBeanDefinitions 方法解析Document里面的自定义标签:
    在方法内部会遍历各个节点,如果是默认标签,(bean标签就是默认标签),就调用
    DefaultBeanDefinitionDocumentReader#parseDefaultElement 解析里面的属性


    如果是自定义标签就调用(context就是自定义标签)
    BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element)

    再然后通过
    BeanDefinitionParserDelegate#parseBeanDefinitionElement(org.w3c.dom.Element, BeanDefinition)将一个个标签封装成AbstractBeanDefinition对象,再封装成BeanDefinitionHolder
    然后经过一系列的处理,缓存到
    DefaultListableBeanFactory#beanDefinitionNames容器里面

    )

    再然后到AbstractApplicationContext#finishBeanFactoryInitialization方法里面调用
    ConfigurableListableBeanFactory#preInstantiateSingletons方法,

    在这个方法内部将beanDefinitionNames里面的所有东西取出来挨个循环封装成RootBeanDefinition,然后判断内部属性如果不是抽象,单例,或者非懒加载就开始实例化,调用getBean()方法,然后再调用 DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean) 从singletonObjects容器里面获取,如果获取不到就从earlySingletonObjects获取,如果还获取不到就从singletonFactories里面获取 ,如果都获取不到就开始创建


    AbstractAutowireCapableBeanFactory#doCreateBean 创建,然后调用
    AbstractAutowireCapableBeanFactory#createBeanInstance开始创建Bean,创建是根据反射从RootBeanDefinition里面获取属性,比如说获取到class的权限定类名等等,再然后放入到singletonFactories容器里面,
    然后会在
    AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
    方法完成调用XXXAware方法和@PostConstruct等等调用和InitializingBean接口,afterPropertiesSet,init-method属性调用,然后执行
    DefaultSingletonBeanRegistry#addSingleton 放入singletonObjects容器里面
    然后在AbstractBeanFactory#getObjectForBeanInstance方法是FactoryBean接口的调用入口


    完结.


    BeanDefinitionParserDelegate 调用 parseBeanDefinitionElement 方法解析 标签封装成 BeanDefinitionHolder 对象 ,


    简单叙述
    1、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    该方法主要进行xml解析工作,流程如下:

    1、创建XmlBeanDefinitionReader对象
    2、通过Reader对象加载配置文件
    3、根据加载的配置文件把配置文件封装成document对象
    4、创建BeanDefinitionDocumentReader对象,DocumentReader负责对document对象解析
    5、parseDefaultElement(ele, delegate);负责常规标签解析
    6、delegate.parseCustomElement(ele);负责自定义标签解析
    7、最终解析的标签封装成BeanDefinition并缓存到容器中