Spring BeanFactory创建和解析登记Bean对象过程!

目录

 

前言:Spring的设计理念

三大核心组件以及协同工作

BeanFactory的创建顺序图

代码全路径展示

解析和登记 Bean 对象时序图

代码全路径展示

其实看到顺序图就了解差不多了,代码太多,整个过程如下:


前言:Spring的设计理念

Spring最重要的是三个组件,Bean/Context/Core

这个场景类似于,演员(Bean)、舞台(Context)、演出工具(Core)

Spring解决了一个重要的问题,它把对象之间的依赖关系而用配置文件来管理。

三大核心组件以及协同工作

Bean存储对象信息,Context给Bean创建一个运行环境,Core是Bean与Context交流的工具


BeanFactory的创建顺序图

代码全路径展示

org.springframework.context.support.ClassPathXmlApplicationContext
    org.springframework.context.support.AbstractApplicationContext#refresh
        //BeanFactory的创建过程
       org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory
            org.springframework.context.support.AbstractApplicationContext#refreshBeanFactory
                //创建新的BeanFactory
                org.springframework.context.support.AbstractRefreshableApplicationContext#createBeanFactory
                    //加载BeanDefinition信息装入BeanDefinitionMap中(这个过程下图揭示)
    、            org.springframework.context.support.AbstractRefreshableApplicationContext#loadBeanDefinitions
                

解析和登记 Bean 对象时序图

代码全路径展示

//从特定的xml文件加载Bean Definitions
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions
    //使用资源读取器读取xml资源,将资源和流文件封装为Document文档,因为Doc文档有很好的结构信息,进而注册包含在其中的Bean Definition信息
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader#registerBeanDefinitions
        //文档需要读取器,进而创建Bean Definition Document的读取器
        org.springframework.beans.factory.xml.XmlBeanDefinitionReader#createBeanDefinitionDocumentReader
            //从DOM中加载特定xml文件中的Bean Definition信息,并将其装入Map中
            org.springframework.beans.factory.xml.BeanDefinitionDocumentReader#registerBeanDefinitions
                //从给定的DOM根元素中注册Bean Definition
                org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions
                    //此处解析DOM的元素
                    org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
                    org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseDefaultElement
                        //判断为BEAN_ELEMENT类型的话,就进入此方法
                        org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#processBeanDefinition
                            //此处得到需要注册的Bean的Name和BeanDefinition对象
                            org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition
                                //将两者传入参数进行注册(存入Factory的Map和Names中)
                                org.springframework.beans.factory.support.BeanDefinitionRegistry#registerBeanDefinition
//里面内部方法中最终通过下面两句代码,将Bean Definition存入Map
//this.beanDefinitionMap.put(beanName, beanDefinition);
//this.beanDefinitionNames.add(beanName);

其实看到顺序图就了解差不多了,代码太多,整个过程如下:

分界线之间的方法是在一个类中!


refresh


obtainFreshFactory


refreshBeanFactory


createBeanFactory

loadBeanDefinitions(beanFactory)


XmlBeanDefinitionReader

loadBeanDefinitions(beanDefinitionReader)


loadBeanDefinitions(resource)


doLoadBeanDefinitions(inputSource, encodedResource.getResource())


BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();

doRegisterBeanDefinitions(doc.getDocumentElement());


parseBeanDefinitions(root, this.delegate);


将Bean并装入BeanDefinitionMap和BeanDefinitionNames

这两个方法都是存储Bean对象,不一样的是

上面的方法是针对默认的命名空间的对象,满足下面的条件:

BEANS_NAMESPACE_URI=http://www.springframework.org/schema/beans

下面的方法是针对其他对象例如http://www.springframework.org/schema/context,http://www.springframework.org/schema/aop等

年轻就要多读书!!!

猜你喜欢

转载自blog.csdn.net/StrawberryMuMu/article/details/101628690