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的几个阶段理解其工作过程的更多相关文章

  1. spring常用注解以IOC理解

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  2. spring入门(Ioc的理解)

    spring对依赖的注入理解可以参考这篇:https://www.cnblogs.com/alltime/p/6729295.html 依赖注入和控制反转 传统的JavaEE程序中,直接在内部new一 ...

  3. spring容器和上下文的理解

    spring容器和上下文的理解 spring框架现在使用的很多,这说明有其独特之处----依赖注入,很简单的四个字,在我们需要对象的时候,spring就可以给我们提供所需要的对象,对象的创建.销毁.管 ...

  4. Spring Security 实战干货:理解AuthenticationManager

    1. 前言 我们上一篇介绍了UsernamePasswordAuthenticationFilter的工作流程,留下了一个小小的伏笔,作为一个Servlet Filter应该存在一个doFilter实 ...

  5. Spring中Bean的实例化与DI的过程

    引言 前文我们介绍了关于如何学习Spring的源码以及解析了spring中加载配置文件注册Beandefinition的过程.今天我们继续学习DI的过程. 创建实例和DI过程 IOC和DI都是对spr ...

  6. Spring Ioc源码分析系列--Bean实例化过程(一)

    Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...

  7. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  8. 彻底理解MapReduce shuffle过程原理

    彻底理解MapReduce shuffle过程原理 MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapR ...

  9. Maven聚合、Maven仓库jar包以及Spring+MyBatis+JUnit+Maven整合测试的搭建过程

    一.Maven将父项目创建到父项目的内部 在父项目的pom.xml上 点右键,选择maven-->new-->maven module  project 二.Maven聚合 在某个项目的p ...

随机推荐

  1. 楼塔当天领袖acm心理(作为励志使用)

    楼主个人博客:吉尔博客 假期空闲的时候使用.这些年来GCJ.ACM,TopCoder 的一个号码的一重要的比赛的参与 回顾.GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前.我 ...

  2. JS-LINQ

    JS中使用LINQ 详细使用方法可找相关资料 文件在这里 引用: <script type="text/javascript" src="@Url.Content( ...

  3. NSURLSession 网络库 - 原生系统送给我们的礼物

    大家在进行iOS开发的时候一定会用到网络操作.但由于早期原生的 NSURLConnection 操作起来有很多不便,使得大家更愿意使用第三方库的解决方案,比如鼎鼎大名的 AFNetworking.正是 ...

  4. Easyui Tab刷新

    Easyui Tab刷新: function refreshTab(title){ var tab = $('#id').tab('getTab',title); $('#id').tab('upda ...

  5. node 后台管理插件forever

    在一台计算机上手动跑Node项目简单,node xx.js就搞定了,想让Node项目后台运行,虽然不能直接用node命令搞定,但是在安装了forever这个包以后,还是很轻松的.不过要是在远程服务器上 ...

  6. glibc内存管理方式

    程序员接触的内存空间和系统接触的物理内存空间是有所区别的.对于一般进程来讲,他面对的是一个线性虚拟内存空间:地址从0到最大值.每一个进程面对的虚拟内存空间都是一样的,都享有全部的内存地址.虚拟内存空间 ...

  7. 重写combobox模板,实现支持过滤的combobox

    先看效果图 客户提出需求后,首选在百度查找可靠方案 看了几个,效果都不理想, 大多是把isEditNable设置成true,IsTextSearchNable设置成false 再对itemsSourc ...

  8. 微信小程序把玩(十九)radio组件

    原文:微信小程序把玩(十九)radio组件 radio组件为单选组件与radio-group组合使用,使用方式和checkbox没啥区别 主要属性: wxml <!--设置监听器,当点击radi ...

  9. asp.net 调用带证书的webservice解决办法

    最近在朋友弄一个调整省政府政务工作流的程序.. 需要把当前的信息推送到政务网上,采用的是带证书的https webservice.. 下面说一下实现过程 第一步,引用webservice地址,删除we ...

  10. eclipse 插件编写(三)

    参考:http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fworkbench_ ...