`

Spring源码学习

 
阅读更多

a)         Spring 初始化的时候首先要运行的类为: org.springframework.web.context. ContextLoaderListener org.springframework.web.context. ContextLoaderServlet

       它们在初始化函数里无一例外地实例化了 ContextLoader , 然后调用了它的函数      public WebApplicationContext initWebApplicationContext(ServletContext )

       接下来看一下在这个方法里干了写什么

b)        在他的方法体内,关键是“ this.context = createWebApplicationContext(servletContext, parent); ”新建了一个“ ConfigurableWebApplicationContext ”类型的对象,在这一步实例化中几乎完成了所有的 spring 初始化工作。读取了所有的 spring 配置文件。它的工作步骤如下所述。

c)        首先,在将“ ConfigurableWebApplicationContext ”类型的对象实例化以后(这个对象实际的类型是这个包内的 XmlWebApplicationContext ),然后又给这个实例设置了三个属性,“ wac.setParent(parent); ”在默认的初始化过程中这一步设置了一个 null 值,然后又设置了一个“ wac.setServletContext(servletContext); ”,将系统默认的上下文设置进来,比较重要的是下面这一段:           

       if (configLocation != null) {

       // 读取 spring 的应用配置文件

       wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,Configurabl       eWebApplicationContext.CONFIG_LOCATION_DELIMITERS));

       }

       它将我们的配置文件名放置到 wac 变量中,以待在后续的操作中使用。然后调用           wac.refresh(); ”完成主要的初始化 BeanFactory 的操作。如下。

d)        首先我们应该看一下我们实例化的对象

       org.springframework.web.context.support.XmlWebApplicationContext 的类图: 

 

 

e)         wac.refresh(); ”从类结构里我们能找到这个方法来自它的父类: AbstractApplicationContext 在它的 refresh() 方法内我们可以看到 spring 的复杂逻辑。

       首先执行了 refreshBeanFactory(); (来自 AbstractRefreshableApplicationContext )见 f),

f)         refreshBeanFactory(); 这个方法由负责维护变量 beanFactory 的子类 AbstractRefreshableApplicationContext 实现,默认情况下这个方法直接实例化一个新的 DefaultListableBeanFactory 类型的 BeanFacorty, 然后调用一个起缓冲作用的配置函数生成一个将 beanFacroty 包装起来的对象 beanDefinitionReader ,然后对这个对象进行属性配置,实际上该方法主要负责生成一个临时的操作对象,对应调用的函数为“ loadBeanDefinitions(beanFactory); ”该方法为初始化期间较为重要的一个。        该方法来自其子类: AbstractRefreshableWebApplicationContext 对应的函数:

protected void loadBeanDefinitions(DefaultListableBeanFactory) ,然后这里又调用了自己定义的 protected void loadBeanDefinitions(XmlBeanDefinitionReader) 方法。此时,它就使用到了在 c) 中设置了的( wac.setConfigLocations(……)) 我们开发中密切相关的配置文件。(同时也要记住此时这个函数的参数 beanDefinitionReader ,之前已经设置了“ beanDefinitionReader.setResourceLoader(this); ”这里的 this 是我们在前面见到的 XmlWebApplicationContext (一个定义好了的上下文))。接着往下:

       reader.loadBeanDefinitions(configLocations[i]); reader 开始加载我们配置文件内的东西了,不过真正复杂的实现此时才开始,我们继续往下走,在接下来的方法内默认情况下会执行:

if (resourceLoader instanceof ResourcePatternResolver) (该判断条件为 true , 由于从上面我们知道: beanDefinitionReader.setResourceLoader(this); this 的类型为: XmlWebApplicationContext 所以 ((ResourcePatternResolver) resourceLoader).getResources(location); 得到一个 Resource[] 数组,接下来调用:

int loadCount = loadBeanDefinitions(resources); 该函数继续调用自己子类定义的一系列临时接口最终执行到 return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); 在这个函数内初始化了处理 xml 文件的一些对象并将用户的配置文件解析为一个 Document 对象。然后又执行了一系列函数直到

return parser.registerBeanDefinitions(this, doc, resource); 这个函数来自我们新建的 DefaultXmlBeanDefinitionParser ,在这个类里最终执行了对 xml 文件的解析工作和对 beanFacroty 变量执行了设置工作。

g)        终于我们从这些繁杂的逻辑中跳了出来,继续执行 AbstractApplicationContext.refresh() 下面的工作,后续的代码主要仍旧是往一些常量里面设值。

此时 spring 初始化过程就结束了。

分享到:
评论

相关推荐

    Spring源码学习一:源码分析概述1

    Spring源码学习概述 Spring是Java生态系统中的一种流行的开源框架,由Rod Johnson创立于2003年。Spring框架的主要目标是使Java应用程序的开发变得更加简洁、灵活和可维护。Spring框架的核心思想是基于依赖注入...

    spring源码学习之思维导图

    1、spring 的整体架构 2、spring的基本实现(xml的加载原理、标签解析、bean加载) 3、容器扩展 4、ioc和aop 5、事务 6、springmvc 7、dispatcherServlet

    spring源码学习

    在"Spring源码学习"的过程中,你需要阅读和理解上述各个模块的核心类和接口,观察它们如何协同工作。Spring框架的设计思想和实现方式对于提升Java开发技能和理解软件设计原则非常有帮助。通过分析源码,你可以更深入...

    struts+hibernate+spring源码学习:hr考勤管理系统.rar

    struts+hibernate+spring源码学习:hr考勤管理系统.rar

    Spring源码学习工具(包括编译版源码、未编译版源码和相关工具)

    Spring源码学习是深入理解这个框架工作原理的重要途径。这份"Spring源码学习工具"包含了编译版和未编译版的源码,以及相关辅助工具,旨在帮助开发者更有效地探索Spring的内部机制。 首先,让我们谈谈编译版和未编译...

    Spring源码学习加注释,方便学习.zip

    spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    struts+hibernate+spring源码学习:BBS系统

    struts+hibernate+spring源码学习:BBS系统 注意:此资源已经更新,请大家下载 struts+hibernate+spring源码学习:BBS系统(6月5日上传版) 页面: http://download.csdn.net/source/1383098

    SpringMVC精品资源--spring源码学习附注释(Version 4.2.0),the second deb.zip

    在标题中提到的"Spring源码学习附注释(Version 4.2.0)",这部分内容指的是Spring框架的核心源代码,版本为4.2.0。源码学习对于深入理解Spring的工作原理和扩展自定义功能至关重要。注释的加入使得源码更易于阅读和...

    Spring高级源码学习笔记.zip

    总之,Spring源码学习是一个深化编程技能,理解设计模式,以及提高问题解决能力的过程。通过深入研究,程序员不仅可以优化自己的代码,还能更高效地利用Spring框架提供的功能,提升项目的可维护性和扩展性。

    Spring源码学习文档,绝对值得好好研究~~

    Spring源代码解析(一)Spring中的事务处理.doc Spring源代码解析(二):ioc容器在Web容器中的启动.doc Spring源代码分析(三):Spring JDBC.doc Spring源代码解析(四):Spring MVC.doc Spring源代码解析(五):Spring ...

    马士兵老师spring框架学习笔记

    马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...

    struts+hibernate+spring源码学习:家教管理系统.rar

    Struts、Hibernate和Spring是Java开发中非常重要的三个框架,它们分别在Web层、持久化层和业务层发挥着核心...通过分析和学习这个源码,你可以更好地理解这三大框架的协同工作原理,从而提高自己的开发效率和代码质量。

    struts+hibernate+spring源码学习:BBS系统(6月5日上传版)

    通过分析和学习这个BBS系统的源码,你可以深入了解Struts的请求处理流程,Hibernate的对象映射机制,以及Spring如何协调各个组件工作。这对于提升Java Web开发能力,尤其是企业级应用开发技能,是非常有价值的实践。...

    Spring源码学习-JPetStore.part3

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包

    struts+hibernate+spring源码学习:BBS系统(6月13日上传版)

    学习这个源码可以帮助开发者提升对Java Web开发的整体理解和实践能力,为构建更复杂的应用打下坚实基础。同时,了解这些框架的内部原理也有助于优化性能,解决可能出现的问题。通过这个BBS系统的源码,我们可以深入...

    SpringStudy:GitHub下载的Spring源码,用于Spring源码学习

    Spring框架 这是Spring框架的所在地:所有的基础。 总体来说,Spring框架和Spring项目系列通常简称为“ Spring”。 Spring提供了Java编程语言以外的所有所需内容,可用于为各种场景和体系结构创建企业应用程序。 请...

    Spring源码学习-JPetStore.part1

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导入eclipse中运行。共3个压缩包

    Spring源码学习-JPetStore.part2

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包

Global site tag (gtag.js) - Google Analytics