深入探究Spring MVC
Spring MVC 核心是请求驱动模型(请求是起点,处理流程完全围绕请求展开,所有组件的行为由请求驱动)和分层设计。
1 DataBinder
Spring的DataBinder 用于数据绑定、类型转换及验证。使用场景由:1)完成xml配置文件定义bean属性的绑定。2)Web请求参数绑定。
DataBinder 绑定属性的流程如下:
- 类型转换,将字符串转换为目标属性的类型。如String ->Data。
- 数值绑定,将转换后的值设置到目标对象属性中。
- 数据验证,对绑定后的对象属性进行校验。
PropertyEditor | 非线程安全,Java 定义的一个接口,用户字符串与对象属性类型的相互转换。 Spring通过每次绑定时创建新的PropertyEditor实例或使用ThreadLocal避免并发冲突。 |
Converter<S,T> | Spring 3+ 引入,无状态,线程安全。将类型S转换为类型T。 |
Formatter<T> | 将String与类型T互相转换,支持本地化。线程安全 |
表 类型转换实现接口对比
2 DispatcherServlet
DispatcherServlet 接收所有请求并委托其他组件进行处理。
javax.servlet.ServletContainerInitializer 是Servlet 3.0规范中定义的接口,所有Servlet 3.0容器启动时会调用这个接口的onStartup方法。通过SPI的方式,由第三方负责提供实现类。
Spring MVC实现了上面这个接口,并在onStartup方法中初始化DispatcherServlet。
2.1 分层设计
DispatcherServlet处理请求的流程如下:
1)确定处理器。
组件:HandlerMapping。(如RequestMappingHandlerMapping)。
处理:遍历所有注册的HadlerMapping(控制器方法),找到与当前请求匹配的处理器。
2)执行处理器。
组件:HandlerAdapter。(如RequestMappingHandlerAdapter)
处理:1根据处理器类型调用对应的HandlerAdapter。2 HandlerAdapter完成以下操作:a)参数解析,使用ArgumentResolver解析控制器方法参数(如@RequestParam、@RequestBody)。b)数据绑定与校验。通过DataBinder绑定请求参数到对象,触发@Valid验证。c)调用控制器方法执行实际业务逻辑。d)返回值处理。使用ReturnValueHandler处理结果(如@ResponseBody)。e)异常捕获处理。捕获异常并传递给HandlerExceptionResolver处理。
3)渲染视图/处理响应数据
a) 返回视图。
组件:ViewResolver(如InternalResourceViewResolver)
处理:将逻辑视图解析为具体的View实例(如JSP)。
b)返回数据
组件:HttpMessageConverter(如MappingJackson2HttpMessageConverter)
处理:将返回值(如实体类)转换为JSON/XML格式。
2.2 过滤器与拦截器
过滤器 | 拦截器 | |
工作级别 | Servlet 规范,不依赖Spring。可以拦截任何资源。 | Spring MVC特有,只会对控制器的方法进行拦截。 |
执行时机 | 在请求到达DispatcherServlet之前及响应返回客户端之前。 | 在请求进入DispatcherServleth后,请求处理前、处理后,整个请求完成后。 |
表 过滤器与拦截器对比