
本文共 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等
年轻就要多读书!!!
发表评论
最新留言
关于作者
