目录
前言: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等
年轻就要多读书!!!