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的运行原理,只是粗略的进行分析,实际的执行过程比这复杂的多的多。有兴趣的同学可以阅读源码或查阅资料了解更多。

最新文章

  1. cocoapods
  2. 20155206赵飞技能获取经验,C语言学习感想与对JAVA的学习目标
  3. i2c之at24c08驱动及应用程序
  4. Erlang 101 Erlang环境和顺序编程
  5. 在Label中显示一段文字
  6. JavaScript获取onclick、onchange等事件的值
  7. 菜鸟教程之工具使用(十四)——Maven项目右击没有“Maven”菜单选项
  8. LintCode &quot;Maximum Gap&quot;
  9. EasyUI-在iframe里获取现阶段选中的tab的标题
  10. codeforces #313 div1 C
  11. bt 介绍以及 bt 种子的hash值(特征值)计算
  12. IOI1994 北京2008的挂钟 迭代加深
  13. Erlang ODBC 处理中文
  14. cmake学习笔记(五)
  15. 小程序 表单 获取 formId
  16. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
  17. git-bash的alias别名设置
  18. .NET 发送电子邮件
  19. LeetCode算法题-Guess Number Higher or Lower(Java实现)
  20. ClassOne__HomeWork

热门文章

  1. Haroopad 安装到 Mac OSX
  2. qt线程(转)----这篇很专业!
  3. corefx 源码学习:NetworkStream.ReadAsync 是如何从 Socket 异步读取数据的
  4. WPF GridSplitter最好设置HorizontalAlignment和VerticalAlignment,否则不可以左右移动
  5. WPF 打印不显示的元素
  6. mariadb 允许远程访问
  7. 不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)
  8. iText类库再pdf中显示中文字体
  9. vs编译在win xp电脑上运行的win32程序遇到的问题记录(无法定位程序输入点GetTickCount64于动态链接库KERNEL32.dll)
  10. Tomcat cache 缓存 编译