前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从Spring的几个阶段理解其工作过程

从Spring的几个阶段理解其工作过程

原创
作者头像
编程大道
修改2019-07-15 10:57:16
6170
修改2019-07-15 10:57:16
举报
文章被收录于专栏:编程大道编程大道

Spring框架非常强大,想要彻底弄懂Spring是非常困难的。

为了便于了解Spring的工作原理,我们来研究一下,Spring是怎么加载的,Spring会经过几个阶段。

我们站在Javaweb的角度将Spring分为若干阶段进行分析,以便加深我们对Spring的理解。

Spring的运行大致分可以为三个阶段:配置阶段、初始化阶段和运行时阶段。

图解

我们通过下图来了解下Spring的几个阶段。

配置阶段

这里我们以JavaWeb项目为例,当你创建一个Spring项目后,假如你要启动这个项目,你首先要做什么?肯定是要先配置。

我们首先会找到web.xml文件,在web.xml里引入Spring容器、请求分发器的配置,因为web.xml是整个web项目的入口。

代码语言:javascript
复制
<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映射。

代码语言:javascript
复制
@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

代码语言:javascript
复制
handlerMapping.put("/info/findInfoByType","InfoController.selectByInfoType(String infoType)");

运行时阶段

处理URL请求,通过DispatchServlet分发器,从HandlerMapping找到对应的类的方法,并使用反射机制将用户的请求分发到对应的Controller的对应方法进行处理,然后将处理结果返回给用户。

代码语言:javascript
复制
String method = handlerMapping.get("/info/findInfoByType");
//找到对应方法后,利用反射机制调用方法

结语 

这里通过图解方式帮助理解Spring的运行原理,只是粗略的进行分析,实际的执行过程比这复杂的多的多。有兴趣的同学可以阅读源码或查阅资料了解更多。

说的再好,不如行动。不怕慢,就怕站。

公众号@编程大道,第一之间阅读技术文章。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图解
  • 配置阶段
  • 初始化阶段
  • 运行时阶段
  • 结语 
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档