spring-mvc
spring-mvc不是spring的core内容,需要额外引入jar包
spring-mvc默认是servlet实现,所以运行spring-mvc需要借助servlet容器,如tomcat
WebApplicationContext
spring-mvc有一个Application的实现WebApplicationContext, 用于定义web环境上下文.
启动
通常的spring-mvc启动,是编写好web.xml文件并把程序打成war包,丢到tomcat的指定目录,最后启动tomcat.
由tomcat引导启动spring-mvc程序。
如果是使用spring-boot,过程类似,只是都是用java代码实现web.xml配置合内嵌tomcat的方式。
通常web.xml的配置必须的两个配置是
1、ContextLoaderListener监听器,负责监听tomcat的启动和销毁,并初始化WebApplicationContext.
contextInitialized方法
初始化的WebApplicationContext对应的是spring-application.xml声明的context
2、DispatcherServlet 也初始化WebApplicationContext. 查找controller配置。
父类HttpServletBean.init()方法
初始化的WebApplicationContext是spring-mvc.xml声明的context
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-application.xml</param-value>
</context-param>
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
controller到RequestMapping
即controller的@RequestMapping到HandlerMapping的处理过程
RequestMappingHandlerMapping对象实现了InitializingBean接口,在RequestMappingHandlerMapping被spring初始化完成后触发后置方法。
最终触发父类AbstractHandlerMethodMapping的initHandlerMethods, 在这里把controller的@ReqeustMapping方法处理成HandlerMapping
大致流程
1、获取容器的所有bean名称
2、遍历获取到的所有bean名称,如果不是被代理对象,则继续。如果是被代理对象,则不处理。
3、获取bean类型,如果类型非空, 且bean类型有@Controller或者@RequestMapping标识, 则继续
4、对bean类的所有方法进行处理, 包括根据方法和类描述生成RequestMappingInfo对象
5、最后把RequestMappingInfo注册到MappingRegistry
至此,完成controller的RequestMapping注册.
请求路由过程
http请求通过tomcat到DispatcherServlet,doDispatch方法的getHandler(request)步骤.
1、通过AbstractHandlerMethodMapping的getHandlerInternal方法。
HandlerMapping有多种实现, 最主要的就是RequestMappingHandlerMapping和SimpleUrlHandlerMapping
2、根据HandlerMapping取得对应的适配器 RequestMappingHandlerAdapter,
换句话说,如果是SimpleUrlHandlerMapping的话适配器就是HttpRequestHandlerAdapter
3、使用适配器执行方法调用和处理返回值
总结
spring-mvc 加载启动过程需要额外的配置, 即使是使用spring-boot,也是在spring-boot-autoconfigure模块指定了servlet容器和DispatcherServlet的配置,自动封装了一层。了解spring-mvc的基本启动加载过程,有助于理解整个http请求响应的处理.