spring web请求statuscode = 200 无响应值_Spring和SpringMVC底层源码分析

本文深入探讨Spring Web请求返回statuscode=200但无响应值的情况,通过源码分析Spring启动流程、ApplicationContext容器以及SpringMVC的运行原理。涉及关键类如DefaultListableBeanFactory、DispatcherServlet、HandlerMapping和HandlerAdapter等,旨在理解Spring框架的内部工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习主题:源码分析

学习目标:

对应视频:

http://www.itbaizhan.cn/course/id/85.html

对应文档:

对应作业

1. Spring源码分析

(1) Spring的运行流程是什么

spring启动时读取Bean配置文件信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系

aa912724807a680eaaeb801d78e33d25.png

(2) 写出Spring重要的类和接口以及作用

2. ApplicationContext容器介绍

ApplicationContext内部封装了一个BeanFactory对象,来实现对容器的操作,BeanFactory封装了bean的信息,而ApplicationContext通过访问BeanFactory对象获取bean的对象信息ApplicationContext也实现了一系列的BeanFactory接口(可以说ApplicationContext对BeanFactory对象实现一种代理)

ApplicatonContext在应用这个DefaultListableBeanFactory对象的基础上,不仅实现了BeanFactory接口提供的功能方法,并且黏合了一些面向应用的功能

053c1ef7b28719fa1c16f02c4929ded8.png

ClassPathXmlApplicationContext

bef2fb4d354f1fac6d8dc5f97d19488a.png

Refresh() 方法

实例化Bean工厂

DefaultListableBeanFactory

在BeanFactory子类中有一个DefaultListableBeanFactory类.它包含了基本Spring IOC 容器所具有的重要功能,开发时不论是使用BeanFactory系列还是ApplicationContext系列来创建容器基本都会使用到DefaultListableBeanFactory类.可以这么说,在spring中实际上把它当成默认的IOC容器来使用

98a3038858a81ac1702688f74bf2a4f3.png

解析配置文件

XmlBeanDefinitionReader

19616ffff471d99a770d79dde11d70a2.png

将BeanDefintion注册到容器中

41dd61629c7ef3b23f19409baf06df55.png

Bean对象的实例化

20839938c104fb4aed889e036d3c4815.png

9f038dd243f3177a948a2ddc525bc493.png

分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

第212次(源码分析)

学习主题:源码分析

学习目标:

对应视频:

http://www.itbaizhan.cn/course/id/85.html

对应文档:

对应作业

3. SpringMVC底层源码分析

(1) 写出SpringMVC运行原理

06cb650272b0cc0cc92a1c939bf79266.png

(2) 写出SpringMVC常用类和接口以及作用

1. DispatcherServlet(中央处理器)

b51efaacaaeefcec23e4d6e7d1d74bcd.png

2. HttpServletBean

HttpServletBean覆写了init方法,主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中,比如servlet标签的子标签init-param标签中配置的参数

0f626482157f310b59d1be5385c4c95c.png

3. ServletConfigPropertyValues

ServletConfigPropertyValues 是 HttpServletBean 的静态内部类。在其构造方法中通过传

递的 ServletConfig 对象对 web.xml 文件中的 DispatcherServlet 节点中的参数进行解析处理。

4. FrameworkServlet

将 Servlet 上下文与 Spring 容器上下文关联。其实也就是初始化 FrameworkServlet 的属

性 webApplicationContext , 这 个 属 性 代 表 SpringMVC 上 下 文 对 象 , 实 际 类 型

ConfigurableWebApplicationContext。如果项目中用到 spring 了那么它有个父容器,既 web.xml

中配置的 ContextLoaderListener 监听器初始化的容器上下文

320a20fbc26d8d3f2922b18d934b2d53.png

InitWebApplicationContext() 方法

41f76acd9b44f7ded2c6ed2a735ad3fd.png

如果项目中使用 spring 框架,并且在 web.xml 文件中配置了 Listener 来启动 spring。那

么 在 监 听 器 中 spring 会 创 建 WebApplicationContext 容 器 。 此 时 会 将 该 容 器 转 换 为

ConfigurableWebApplicationContext 即 SpringMVC 容器。

75542f9480cb982b2e2771bda4b69b91.png

如果没有在 web.mxl 文件中配置 Listener 那么此时 webApplicationContext

为 空 则 去 ServletContext 中 根 据 attrname 查 找 。 如 果 为 找 到 , 执 行

createWebApplicationContext 方法来创建 SpringMVC 的容器。

5. refresh();

解析配置文件初始化 SpringMVC 的 IOC 容器环境。

解析 springmvc 配置文件:

8a2496d44a74f6adfd3010f6aa76457f.png

c7c510079926c3b5cd5eadaa6c7cd765.png

20a8c70d8493ca254e432728e507665a.png

6. initStrategies(ApplicationContext context)

初始化SpringMVC其他组件:如多部件解析器,处理器映射器,处理器适配器,视图解析器

HandlerMapping 接口介绍

作用是根据当前请求的找到对应的 Handler(HandlerMethod(Controller 中的方法)、

Controller 对 象 ) , 并 将 Handler 与 一 堆 HandlerInterceptor ( 拦 截 器 ) 封 装 到

HandlerExecutionChain 对象中。在 HandlerMapping 接口的内部只有一个方法:

HandlerExecutionChain getHandler(HttpServletRequest request);

HandlerMapping 接口实现类

HandlerMapping 实现类有两个分支,分别继承自 AbstractHandlerMethodMapping(得

到 HandlerMethod)和 AbstractUrlHandlerMapping(得到 Controller t),它们又统一继承于

AbstractHandlerMapping。

0a342e258ed9fe779e7b3381f6e064e4.png

AbstractHandlerMethodMapping

AbstractHandlerMethodMapping 这个分支获取的 Handler 的类型是 HandlerMethod,即 这个 Handler 是一个方法,它保存了方法的信息(如 Method),这样一个 Controller 就可

以处理多个请求了。

2c20e35593c1f8df683c9b2d916d2add.png

中 lookupHandlerMethod() 方 法 主 要 工 作 是 在 Map<T, HandlerMethod>

handlerMethods 中找到 HandlerMethod,这里的 T 是 HandlerMappingInfo,它封装了 @RequestMapping 注解中的信息。

HandlerAdapter 接口

SpringMVC 中使用适配器模式来解决不同的 Handler 的执行。根据 Handler 来找到支 持它的 HandlerAdapter,通过 HandlerAdapter 执行这个 Handler 得到 ModelAndView 对 象。

接口中的抽象方法

boolean supports(Object handler); 判断是否支持传入的 Handler

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) 用来使用 Handler 处理请求 long getLastModified(HttpServletRequest request, Object handler); 用 来 获 取 资 料 的 Last-Modified 值

c76dd17b7d3b959db30416f9dfe7ce64.png

AbstractHandlerMethodAdapter 抽象类

利用 RequestMappingHandlerMapping 获取的 Handler 是 HadnlerMethod 类型,它代 表 Controller 里要执行的方法。handlerInternal 是子类 RequestMappingHandlerAdapter 中的

方法。

3707baf3c5228548402c83df40f4b667.png

RequestMappingHandlerAdapter 类

RequestMappingHandlerAdapter 实际就是执行@RequestMapping 注解的方法

handleInternal 方法 在 handlerInternal 方法中通过调用 invokeHandleMethod 方法执行 HandlerMethod 并返回

一个 ModelAndView。

fdaf93a45654a4cc97364551dbc38015.png

HttpRequestHandlerAdapter

HttpRequestHandlerAdapter 。 是 HttpRequestHandler 的 适 配 器 可 以 执 行 HttpRequestHandler 类型的 Handler。其实就是 Controller 中的 handleRequest 方法

2b4783b338e6b70503c4eaeb08823748.png

SimpleControllerHandlerAdapter 类

SimpleControllerHandlerAdapter 是 Controller 实现类的适配器类,其本质也是执行 Controller 中的 handleRequest 方法。

3f1da7d9ffa58fa09b681de654e7712a.png

SimpleServletHandlerAdapter 类

SimpleServletHandlerAdapter 其实是一个 Servlet 的适配器,其最终执行的方法是 Servlet 的 service 方法

6e756b454719e50f3b00d95144451ab2.png

ViewResolver 接口

根据视图的名称将其解析为 View 类型的视图,如通过 ModelAndView 中的视图名称

将其解析成 View,View 是用来渲染页面的,也就是将 Model 填入模板中,生成 html 或 其他格式的文件。

819c9df6bd581baec0eb17cd43d7c46b.png

AbstractCachingViewResolver 抽象类

AbstractCachingViewResolver 是带有缓存的 ViewResolver,它每次解析时先从缓存里查 找,如果找到视图就返回,没有就创建新的视图,且创建新视图的方法由其子类实现。

803efc6964e7c8f8aa1b933f0e25f1ae.png

View 接口

视图渲染器,在该接口中定义了渲染视图的抽象方法。

何为渲染:所谓渲染其实就是将 Model 中的数据放到 HttpServletRequest 中传递 jsp。

void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse

response) throws Exception;

0667230bd0d34bcfc1d8c86b8c40a564.png

分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值