`
wq_pro
  • 浏览: 33139 次
  • 来自: ...
社区版块
存档分类

Spring 初始化之旅(转)

阅读更多
Spring源码学习
 

一、             概述 <o:p></o:p>

二、             Spring 初始化之旅 <o:p></o:p>

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 的类图:

 

<o:p> </o:p>

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 初始化过程就结束了。
责任编辑: chenxh
分享到:
评论

相关推荐

    微服务架构之旅,springcloud.pptx

    微服务架构之旅带你深入探索Spring Cloud的精彩世界。Spring Cloud作为一个强大的微服务工具包,它为企业级开发提供了全面的解决方案,涵盖了配置管理、服务发现、断路器、智能路由、微代理、控制总线等多个核心功能...

    spring源码包.zip

    《Spring框架核心模块深度解析》 Spring框架是Java开发领域中的一个重要组成部分,它以其强大的功能和灵活的设计赢得了广泛的赞誉。...无论是新手还是经验丰富的开发者,理解Spring的源码都将是一次宝贵的进阶之旅。

    spring 在vs控制台程序下的简单使用demo

    5. **主程序中的Spring初始化**:在`Program.cs`中,我们需要初始化Spring容器并获取bean实例。Spring提供了一个`XmlApplicationContext`类来加载配置并创建bean: ```csharp using Spring.Context; using ...

    Spring Boot 2.2.6 源码之旅三SpringApplication启动流程三

    Spring Boot 2.2.6 源码之旅三SpringApplication启动流程三初始化基本流程SpringApplication的setListeners设置监听器deduceMainApplicationClass对端主启动类rungetRunListeners获取SpringApplicationRunListener...

    模拟spring

    总的来说,“模拟Spring”不仅是一次学习之旅,也是一次提升开发技能的过程。通过对源码的阅读和实践,我们可以深入理解Spring的内部工作原理,进一步提升我们的编程水平和问题解决能力。无论你是Spring的新手还是...

    spring入门笔记

    **Spring 框架概述** Spring 是一个开源的 Java 应用框架,它以其轻量级、模块化和面向切...希望这篇入门笔记能为你开启 Spring 的探索之旅,欢迎在学习过程中发现错误或有任何疑问时,通过博主的博客进行交流和指正。

    spring从入门到精通精简笔记

    #### 二、Spring之旅 ##### 2.1 建立开发环境 在开始学习 Spring 之前,需要搭建一个基本的开发环境。这通常包括安装 Java 开发工具包 (JDK)、集成开发环境 (IDE) 如 IntelliJ IDEA 或 Eclipse,以及添加必要的 ...

    Spring in Action(第二版 中文高清版).part2

    第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...

    Spring Boot教程.rar

    在本教程中,你将学习如何使用Spring Initializr初始化一个Spring Boot项目,如何配置pom.xml或build.gradle文件添加所需的依赖。同时,你还将了解到Spring Boot的主配置类@SpringBootApplication,它是启动Spring ...

    Spring的IoC容器之BeanFactory[定义].pdf

    在实际使用中,用户可以通过XML配置文件来定义Bean及其依赖关系,这就是所谓的"BeanFactory的XML之旅"。XML配置文件中可以声明Bean的定义,包括其类名、属性、依赖的其他Bean等。Spring容器会解析这些配置,根据定义...

    spring-boot-2.0.0.M1

    通过IDEA或Eclipse等集成开发环境导入项目,根据需求添加starter依赖,编写启动类,即可开始你的Spring Boot之旅。同时,"东坡软件下载说明.txt"中可能包含有关下载和安装的详细步骤,对于初学者来说是一份宝贵的...

    spring5-spring-5.2.0.RELEASE-dist.zip

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、易扩展和全面的特性深受开发者喜爱。Spring 5.2.0.RELEASE是该框架的一个...通过这个压缩包,开发者可以获取到Spring框架的所有核心模块,开始他们的开发之旅。

    spring-源码.rar

    《深入剖析Spring源码》 Spring框架作为Java领域最广泛使用的开源框架之一,其设计理念、设计模式以及核心组件的实现细节对于任何...Spring源码的阅读和学习,是一场深度技术之旅,也是每个Java开发者进阶的必经之路。

    spring入门案例所需工具

    Spring框架是Java开发中最常用的轻量级开源框架之一,它为构建企业级应用程序提供了一种模块化、可测试和高效的方式。...开始你的Spring之旅,你会发现这个框架的强大和灵活性,为你的Java开发带来无尽的可能性。

    Spring 2框架入门

    Spring 2框架是Java开发中的一个核心组件,它提供了一个全面的应用程序开发模型,旨在简化企业级Java应用程序的创建和...它将引导你逐步了解Spring的基本概念,教你如何配置和使用Spring,从而开启你的Spring开发之旅。

    Spring in Action(第二版 中文高清版).part1

    第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...

    Using Spring from Scratch

    1. **Spring Boot**:简化了Spring应用的初始化和配置,提供了“开箱即用”的功能,如内嵌的Tomcat服务器、自动配置等。 2. **Spring Tool Suite (STS)**:这是一个集成开发环境,专为Spring开发者设计,提供了强大...

    Spring in Action(第2版)中文版

    2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义...

Global site tag (gtag.js) - Google Analytics