`

小读spring ioc源码(一)——整体介绍

阅读更多
最近在读spring ioc的源码,用EA画了几张比较清楚的类图,不过由于SPRING的类继承体系比较复杂,图实在太大了,很难截图贴上来,所以只能用文字叙述了,EA图用附件上传了

在开始之前,先介绍一个整体的概念。即spring ioc容器的加载,大体上经过以下几个过程:

资源文件定位->解析->注册->实例化

其中资源文件定位,一般是在ApplicationContext的实现类里完成的,因为ApplicationContext接口继承自ResourceLoader,其中的getResource()方法,可以将外部的资源,读取为Resource类

然后解析主要是在BeanDefinitionReader中完成的,最常用的实现类是XmlBeanDefinitionReader,其中的loadBeanDefinitions()方法,负责读取Resource,并完成后续的步骤。ApplicationContext完成资源文件定位之后,是将解析工作委托给XmlBeanDefinitionReader来完成的

解析这里涉及到很多步骤,最常见的情况,资源文件来自一个XML配置文件。首先是BeanDefinitionReader,将XML文件读取成w3c的Document文档

然后委托DefaultBeanDefinitionDocumentReader,对Document进行进一步解析

然后DefaultBeanDefinitionDocumentReader又委托给BeanDefinitionParserDelegate进行解析。如果是标准的xml namespace元素,会在Delegate内部完成解析,如果是非标准的xml namespace元素,则会委托合适的NamespaceHandler进行解析

最终解析的结果都封装为BeanDefinitionHolder,至此解析就算完成

然后bean的注册是在BeanFactory里完成的,BeanFactory接口最常见的一个实现类是DefaultListableBeanFactory,它实现了BeanDefinitionRegistry接口,所以其中的registerBeanDefinition()方法,可以对BeanDefinition进行注册

这里附带一提,最常见的XmlWebApplicationContext不是自己持有BeanDefinition的,它继承自AbstractRefreshableApplicationContext,其持有一个DefaultListableBeanFactory的字段,就是用它来保存BeanDefinition

所谓的注册,其实就是将BeanDefinition的name和实例,保存到一个Map中。刚才说到,最常用的实现DefaultListableBeanFactory,其中的字段就是beanDefinitionMap,是一个ConcurrentHashMap

注册也完成之后,在BeanFactory的getBean()方法之中,会完成初始化,也就是依赖注入的过程

大体上的流程就是这样,ioc体系中几个主要的类继承关系图,在附件里有,可以用EA8打开。下一篇博客,再具体地从代码层面进行介绍
分享到:
评论

相关推荐

    SpringIoC的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring的IoC——从一个...

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起来整个过程)

    Spring框架的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring框架——从一个...

    Spring中眼花缭乱的BeanDefinition.docx

    为什么要读Spring源码,有的人为了学习Spring中的先进思想,也有的人是为了更好的理解设计模式,当然也有很大一部分小伙伴是为了应付面试,Spring Bean的生命周期啦,Spring AOP的原理啦,Spring IoC的原理啦,应付...

    Spring技术内幕

    , Spring产品级的IoC容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成Bean的解析和载入?又如何实现Bean的生命周期管理?, Spring如何简捷地在JVM上实现AOP功能?, Spring AOP如何实现Aspect编织...

    MyStudentManagerSSM-1.0.zip

    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 1.2、SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    第一章 绪论 1.1. 选题背景 这几年,许多新名词涌入我们的视野:博客、圈子、播客、WAP等。这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

Global site tag (gtag.js) - Google Analytics