BeanFactory

1:BeanFactory什么:

官方解释The root interface for accessing a Spring bean container,翻译成中文spring bean容器的最基本接口,也就是作为一个spring容器,必须实现它。

2:BeanFactory容器乘的要内容是什么

This interface is implemented by objects that hold a number of bean definitions

2.1他能够乘bean definitions。

对于bean definitions是什么东东,应该看BeanDefinition这个类的定义:A BeanDefinition describes a bean instance, which has property values,constructor argument values, and further information supplied byconcrete
implementations.说白了就是对<bean></bean>标签内容的解析,不过不过xml中<bean>的解析。并非实例化的对象。跟踪BeanFactory的实现类XmlBeanFactory代码发现事实上现了接口BeanDefinitionRegistry。定义了对BeanDefinition的增删改查等操作。

2.2他能够乘单例对象

详细实例化对象的注冊位置(通常是单例的。对于原型没有必要保存)。跟踪BeanFactory的实现类XmlBeanFactory代码发现事实上现了接口SingletonBeanRegistry,在这个接口了,专门定义了单例对象的增增删改查等操作。

XmlBeanDefinitionReader

从xml中读取bean definitions。将xml解析成dom文档,并通过一个实现了
BeanDefinitionDocumentReader接口的对象来解析该dom文档,终于将xml的标签解析为BeanDefinition对象。

BeanDefinitionDocumentReader与BeanDefinitionParserDelegate

将dom文档终于解析为BeanDefinition,并加入到BeanDefinition容器中。

详细的操作流程

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("spring.xml"));


1 在XmlBeanFactory的构造函数中运行
this.reader.loadBeanDefinitions(resource);

reader为其一个字段

private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);

2在loadBeanDefinitions中主要运行的为

doLoadBeanDefinitions(inputSource, encodedResource.getResource())
3在doLoadBeanDefinitions中主要运行的为
registerBeanDefinitions(doc, resource);

4获取BeanDefinitionDocumentReader并运行

registerBeanDefinitions(doc, createReaderContext(resource));

5在registerBeanDefinitions方法中主要运行的为

parseBeanDefinitions(root, delegate);

6通过delegate对dom文档进行解析

delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);

解析类型非常多,再次仅仅是为特殊标签进行了解析

7对解析完毕的BeanDefinition进行注冊
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

解析的xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<bean id="person" class="model.Person">
<property name="name">
<value>lisi</value>
</property>
<property name="sex">
<value>boy</value>
</property>
</bean>
</beans>

解析流程图

注意:此博客为我第一次阅读spring源代码,源代码内容为spring3.0.当中的错误之处请多包涵并欢迎指正。流程图也存在不规范之处

版权声明:本文博主原创文章,博客,未经同意不得转载。

spring来源理解-BeanFactory子类XmlBeanFactory创建过程的更多相关文章

  1. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  2. Spring源码解析 – AnnotationConfigApplicationContext容器创建过程

    Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationC ...

  3. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  4. 死磕Spring之IoC篇 - Bean 的创建过程

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  5. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  6. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  7. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  8. 0003 - 基于xml的Spring Bean 的创建过程

    一.目录 前言 创建 Bean 容器 加载 Bean 定义 创建 Bean Spring Bean 创建过程中的设计模式 总结 二.前言 2.1 Spring 使用配置 ApplicationCont ...

  9. Spring源码浅析之bean实例的创建过程(二)

    在上一篇内容中,介绍了doGetBean方法的源码内容,知道了bean在创建的过程中,有三个范围,单例.多例.Scope,里面都使用到了createBean.下面本篇文章的主要内容,就是围绕creat ...

随机推荐

  1. Delphi 类与对象内存结构浅析(三篇)

    http://blog.csdn.net/starsky2006/article/details/5497082 http://blog.csdn.net/starsky2006/article/de ...

  2. vdsm的SSL证书验证过程

    1. Copy the VDSM certificate of the RHEV-H(Red Hat Enterprise Virtualization Hypervisor ) host to th ...

  3. 移动app接口编程技术-学习实现之PHP进阶 数组

    数组创建,初始化 <?php //请创建一个数组变量arr,并尝试创建一个索引数组 /** * 不带初始值的创建.创建后赋予值 * 注:下标一定是整数 */ $arr = array(); $a ...

  4. vijos P1352 最大获利(最小割)

    请不要随便指点别人该怎么做.每一个人的人生都应该自己掌握.你给不了别人一切.你也不懂别人的忧伤. 微笑不代表快乐.哭泣不一定悲伤 不努力怎么让关心你的人幸福.不努力怎么让看不起你的人绝望. 我用生命在 ...

  5. MySql数据库SQL语句将编码

    -- 查看所有字符编码 SHOW CHARACTER SET; -- 查看创建数据库的指令并查看数据库使用的编码 show create database dbtest; -- 查看数据库编码: sh ...

  6. 使用javaDate类代数据仓库维度表

    使用javaDate类代数据仓库维度表 Date类别: ,返回一个相对日期的毫秒数.精确到毫秒.但不支持日期的国际化和分时区显示. Date 类从Java 开发包(JDK)1.0 就開始进化,当时它仅 ...

  7. (转)在 Visual Studio 2010 中创建 ASP.Net Web Service

    很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net Web Service”这种project了,下面跟帖者云云,有的说这是因为微软已经将Web Service整合进W ...

  8. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  9. Using OpenCV Java with Eclipse(转)

    转自:http://docs.opencv.org/trunk/doc/tutorials/introduction/java_eclipse/java_eclipse.html Using Open ...

  10. art patchoat

    Add patchoat tool to Art. Add a new executable called patchoat to art. This tool takes alreadycompil ...