从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 ...
随机推荐
- 获取root权限及破解原理分析
2012-03-18 17:58:45| 分类: android |字号 订阅 如今Android系统的root破解基本上成为大家的必备技能!网上也有非常多中一键破解的软件,使root破解越来越ea ...
- RGB565与RGB555标志识别位图文件格式
近日从本地16比特位图读出象素彩色数据,并填充ANDROID的BITMAP数据.发现,使用CAVAS当屏幕显示,照片显示的颜色不正确,找了很多资料,原来发现两个原因: 1.将位图的颜色分量掩码弄错了, ...
- Entity framework 更改模型,新增表
在Package Manager Console 中运行命令Enable-Migrations 再次运行可以更新 抄袭 在实体类中增加一个属性以后,执行 Update-Database 命令 ,可以更 ...
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
- C#热敏打印图片 串口打印图片
原文:C#热敏打印图片 串口打印图片 如图,一步一步慢慢调出来的 //串口通信类 public System.IO.Ports.SerialPort serialPort = null; serial ...
- mysql 在不删除数据的时,同时重新更新主键id
1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段:ALTER TABLE `table_name` ADD `id` MEDIUMINT( ...
- 使用Netconf管理Cisco网络设备
测试环境:Cisco CSR1000V虚拟化环境 Step 1:开启Cisco设备netconf-Yang,如下图: CSR1000V(config)#netconf-yang CSR1000V(co ...
- SpringMvc 资料
web.xml解释 http://www.cnblogs.com/superjt/p/3309255.html url-pattern解释 http://www.cnblogs.com/zhangpe ...
- 基于开源软件构建高性能集群NAS系统,包括负载均衡(刘爱贵)
大数据时代的到来已经不可阻挡,面对数据的爆炸式增长,尤其是半结构化数据和非结构化数据,NoSQL存储系统和分布式文件系统成为了技术浪潮,得到了长足的发展.非结构化数据目前呈现更加快速的增长趋势,IDC ...
- 写给非专业人士看的 *** 简介(同时也解释了GFW )
写给非专业人士看的 *** 简介 这个文章来源于一个朋友在***的过程中,搞不清楚 *** 的配置问题,在这里我想按照我对 *** 的理解简单梳理一下,以便一些非专业人士也能了解 long long ...