从Spring的几个阶段理解其工作过程
Spring框架非常强大,想要彻底弄懂Spring是非常困难的。
为了便于了解Spring的工作原理,我们来研究一下,Spring是怎么加载的,Spring会经过几个阶段。
我们站在Javaweb的角度将Spring分为若干阶段进行分析,以便加深我们对Spring的理解。
Spring的运行大致分可以为三个阶段:配置阶段、初始化阶段和运行时阶段。
图解
我们通过下图来了解下Spring的几个阶段。

配置阶段
这里我们以JavaWeb项目为例,当你创建一个Spring项目后,假如你要启动这个项目,你首先要做什么?肯定是要先配置。
我们首先会找到web.xml文件,在web.xml里引入Spring容器、请求分发器的配置,因为web.xml是整个web项目的入口。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param> <servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
初始化阶段
配置完毕后,启动项目时,由web容器自动调用servlet的初始化方法。ContextLoaderListener会从指定的配置文件读取配置信息,将所需要加载的bean初始化并加载到Spring IOC容器,并针对引入@Autowrited注解或通过配置文件声明依赖关系的的bean进行依赖注入和自动装配。然后会初始化HandlerMapping,将带有@Controller注解的bean通过ResultMapping注解的value与方法名绑定,进行URL映射。
@Controller
@RequestMapping("/info")
public class InfoController {
/**
* 按信息类型查找公共信息
* @param infoType 信息类型
* @return
*/
@RequestMapping("findInfoByType")
@ResponseBody
public Map<String, Object> selectByInfoType(String infoType){
//...
return result;
}
}
举个例子,我们看上面这个Controller类,首先类上加了@Controller注解,以及@ResultMapping("/info")注解。selectByInfoType()方法上有@ResultMapping("/findInfoByType")注解。所以当Spring初始化时,注解扫描器就会扫描到该类(使用注解方式的情况下),发现该类有@ResultMapping("/info")注解,然后扫描该类下所有带有@ResultMapping()注解的方法。如下代码,selectByInfoType()方法将会被映射到HandlerMapping
handlerMapping.put("/info/findInfoByType","InfoController.selectByInfoType(String infoType)");
运行时阶段
处理URL请求,通过DispatchServlet分发器,从HandlerMapping找到对应的类的方法,并使用反射机制将用户的请求分发到对应的Controller的对应方法进行处理,然后将处理结果返回给用户。
String method = handlerMapping.get("/info/findInfoByType");
//找到对应方法后,利用反射机制调用方法
结语
这里通过图解方式帮助理解Spring的运行原理,只是粗略的进行分析,实际的执行过程比这复杂的多的多。有兴趣的同学可以阅读源码或查阅资料了解更多。
从Spring的几个阶段理解其工作过程的更多相关文章
- spring常用注解以IOC理解
使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...
- spring入门(Ioc的理解)
spring对依赖的注入理解可以参考这篇:https://www.cnblogs.com/alltime/p/6729295.html 依赖注入和控制反转 传统的JavaEE程序中,直接在内部new一 ...
- spring容器和上下文的理解
spring容器和上下文的理解 spring框架现在使用的很多,这说明有其独特之处----依赖注入,很简单的四个字,在我们需要对象的时候,spring就可以给我们提供所需要的对象,对象的创建.销毁.管 ...
- Spring Security 实战干货:理解AuthenticationManager
1. 前言 我们上一篇介绍了UsernamePasswordAuthenticationFilter的工作流程,留下了一个小小的伏笔,作为一个Servlet Filter应该存在一个doFilter实 ...
- Spring中Bean的实例化与DI的过程
引言 前文我们介绍了关于如何学习Spring的源码以及解析了spring中加载配置文件注册Beandefinition的过程.今天我们继续学习DI的过程. 创建实例和DI过程 IOC和DI都是对spr ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...
- 彻底理解MapReduce shuffle过程原理
彻底理解MapReduce shuffle过程原理 MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapR ...
- Maven聚合、Maven仓库jar包以及Spring+MyBatis+JUnit+Maven整合测试的搭建过程
一.Maven将父项目创建到父项目的内部 在父项目的pom.xml上 点右键,选择maven-->new-->maven module project 二.Maven聚合 在某个项目的p ...
随机推荐
- 受限玻尔兹曼机(RBM)以及对比散度(CD)
1. RBM 的提出 BM 的缺点: 计算时间漫长,尤其是无约束自由迭代的负向阶段: 对抽样噪音敏感: 流行软件的不支持: 受限玻尔兹曼机(Restricted Boltzmann Machine,简 ...
- OpenGL(七) 光照模型及设置
OpenGL把现实世界中的光照系统近似归为三部分,分别是光源.材质和光照环境. 光源就是光的来源,是"光"这种物质的提供者: 材质是指被光源照射的物体的表面的反射.漫反射(Open ...
- matlab 求解 Ax=B 时所用算法
x = A\B; x = mldivide(A, B); matlab 在这里的求解与严格的数学意义是不同的, 如果 A 接近奇异,matlab 仍会给出合理的结果,但也会提示警告信息: 如果 A 为 ...
- java的System.getProperty()值的方法可以得到
java.version Java 执行时环境版本号 java.vendor Java 执行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装 ...
- Servlet 3.1实践
Servlet 3.1 新特性详解 参考: IBM developerworks: Servlet 3.0 新特性详解 开涛的博客: Servlet3.1规范(最终版) 关键特性 Asynchroni ...
- ELINK编程器典型场景之远程镜像
当不想直接提供Hex/Bin等二进制程序文件给用户时,通过生成远程镜像功能将程序文件加密后,再提供给用户自行脱机下载来达到远程更新的目的. 远程镜像生成的一般步骤为由客户端提供SN码,本地依据SN码加 ...
- 不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)
首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次.而且都是因为引进了第三方库导致编译过程中报错. 要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一 ...
- 图像滤镜艺术----Brannan滤镜
原文:图像滤镜艺术----Brannan滤镜 作为第一篇文章,本人将介绍Instagram中Brannan 滤镜的实现过程,当然,是自己的模拟而已,结果差异敬请谅解. 先看下效果图: ...
- PHP MYSQL 获取记录总数
$qid = mysql_query(“SELECT count(aid) as total FROM table group by aid “);//你的查询 $res = mysql_fetch_ ...
- Maven 安装和使用
Maven 安装和使用 1.下载 http://maven.apache.org/download.cgi 2.tar -bin.tar.gz 3.环境变量 /etc/profile export M ...