一、 概述 <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 初始化过程就结束了。 |
相关推荐
微服务架构之旅带你深入探索Spring Cloud的精彩世界。Spring Cloud作为一个强大的微服务工具包,它为企业级开发提供了全面的解决方案,涵盖了配置管理、服务发现、断路器、智能路由、微代理、控制总线等多个核心功能...
《Spring框架核心模块深度解析》 Spring框架是Java开发领域中的一个重要组成部分,它以其强大的功能和灵活的设计赢得了广泛的赞誉。...无论是新手还是经验丰富的开发者,理解Spring的源码都将是一次宝贵的进阶之旅。
5. **主程序中的Spring初始化**:在`Program.cs`中,我们需要初始化Spring容器并获取bean实例。Spring提供了一个`XmlApplicationContext`类来加载配置并创建bean: ```csharp using Spring.Context; using ...
Spring Boot 2.2.6 源码之旅三SpringApplication启动流程三初始化基本流程SpringApplication的setListeners设置监听器deduceMainApplicationClass对端主启动类rungetRunListeners获取SpringApplicationRunListener...
总的来说,“模拟Spring”不仅是一次学习之旅,也是一次提升开发技能的过程。通过对源码的阅读和实践,我们可以深入理解Spring的内部工作原理,进一步提升我们的编程水平和问题解决能力。无论你是Spring的新手还是...
2. **Spring之旅** 在开始Spring之旅之前,首先需要建立一个开发环境。通常,这包括安装Java开发工具(JDK),配置Java环境变量,然后选择一个集成开发环境(IDE),如Eclipse或IntelliJ IDEA。对于Spring项目,还...
**Spring 框架概述** Spring 是一个开源的 Java 应用框架,它以其轻量级、模块化和面向切...希望这篇入门笔记能为你开启 Spring 的探索之旅,欢迎在学习过程中发现错误或有任何疑问时,通过博主的博客进行交流和指正。
Java SSM框架初始工程——开启你的Java Web开发之旅你是否正在寻找一个简单而有效的Java SSM(Spring + SpringMVC + MyBatis)框架初始工程?这个项目将为你提供一个坚实的基础,以构建企业级Java Web应用程序。这个...
#### 二、Spring之旅 ##### 2.1 建立开发环境 在开始学习 Spring 之前,需要搭建一个基本的开发环境。这通常包括安装 Java 开发工具包 (JDK)、集成开发环境 (IDE) 如 IntelliJ IDEA 或 Eclipse,以及添加必要的 ...
第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 Initializr初始化一个Spring Boot项目,如何配置pom.xml或build.gradle文件添加所需的依赖。同时,你还将了解到Spring Boot的主配置类@SpringBootApplication,它是启动Spring ...
在实际使用中,用户可以通过XML配置文件来定义Bean及其依赖关系,这就是所谓的"BeanFactory的XML之旅"。XML配置文件中可以声明Bean的定义,包括其类名、属性、依赖的其他Bean等。Spring容器会解析这些配置,根据定义...
通过IDEA或Eclipse等集成开发环境导入项目,根据需求添加starter依赖,编写启动类,即可开始你的Spring Boot之旅。同时,"东坡软件下载说明.txt"中可能包含有关下载和安装的详细步骤,对于初学者来说是一份宝贵的...
Spring框架是Java开发中不可或缺的一部分,它以其模块化、易扩展和全面的特性深受开发者喜爱。Spring 5.2.0.RELEASE是该框架的一个...通过这个压缩包,开发者可以获取到Spring框架的所有核心模块,开始他们的开发之旅。
《深入剖析Spring源码》 Spring框架作为Java领域最广泛使用的开源框架之一,其设计理念、设计模式以及核心组件的实现细节对于任何...Spring源码的阅读和学习,是一场深度技术之旅,也是每个Java开发者进阶的必经之路。
Spring框架是Java开发中最常用的轻量级开源框架之一,它为构建企业级应用程序提供了一种模块化、可测试和高效的方式。...开始你的Spring之旅,你会发现这个框架的强大和灵活性,为你的Java开发带来无尽的可能性。
Spring 2框架是Java开发中的一个核心组件,它提供了一个全面的应用程序开发模型,旨在简化企业级Java应用程序的创建和...它将引导你逐步了解Spring的基本概念,教你如何配置和使用Spring,从而开启你的Spring开发之旅。
第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章 ...
1. **Spring Boot**:简化了Spring应用的初始化和配置,提供了“开箱即用”的功能,如内嵌的Tomcat服务器、自动配置等。 2. **Spring Tool Suite (STS)**:这是一个集成开发环境,专为Spring开发者设计,提供了强大...