Spring BeanFactory创建和解析登记Bean对象过程!
发布日期:2021-05-07 14:08:04 浏览次数:21 分类:原创文章

本文共 3314 字,大约阅读时间需要 11 分钟。

目录

 


前言: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 Definitionsorg.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

下面的方法是针对其他对象例如context,aop等

年轻就要多读书!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上一篇:Spring源码:invokeBeanFactoryPostProcessors(beanFactory);方法
下一篇:Python练习题 :随机生成一批数

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月12日 05时16分47秒