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. ZipHelper 压缩和解压帮助类

    ZipHelper 压缩和解压帮助类 关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 欢迎传播 ...

  2. UpdataData

    MFC中有一个UpdataData函数,有二个参数:TRUE和FLASE,二个参数什么时候用, 开始的时候我也迷糊,后来才发现: UpdataData(TRUE):是把控件上的值刷新到变量中: Upd ...

  3. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  4. [Cocos2d-x]节点的尺寸大小

    作为一个CCNode,本身没有大小而言,但是AddChild之后,便有了尺寸的概念. Cocos2d-x中对于一个节点的尺寸可以通过以下三个方法获取: CCSprite: getContentSize ...

  5. SPOJ DISUBSTR(后缀数组)

    传送门:DISUBSTR 题意:给定一个字符串,求不相同的子串. 分析:对于每个sa[i]贡献n-a[i]个后缀,然后减去a[i]与a[i-1]的公共前缀height[i],则每个a[i]贡献n-sa ...

  6. zoj2314(有上下界的网络流)

    传送门:Reactor Cooling 题意:给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流 ...

  7. FZU2176(二维线段树+dfs)

    传送门:easy problem 题意:给定一棵n个节点以1为根的树,初始每个节点的值为0,现在我们要在树上进行一些操作,操作有两种类型. 1 x val 表示对以x为根的子树的每个点进行加权操作(我 ...

  8. Spark实践的阶段性总结

    写这篇小总结是因为前段时间是自己业余时间对Spark相关进行了些探索,接下来可能有别的同事一起加入,且会去借用一些别的服务器资源,希望可以借此理下思路. 实践Spark的原因 在之前Spark简介及安 ...

  9. 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别

    原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPa ...

  10. 谈谈android反编译和防止反编译的方法(转)

    谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的 ...