- Filter
- DispatcherServlet
- Interceptor
- HandlerAdapter
web程序启动时的初始化顺序: ServletContext -> listener -> filter -> servlet
spring bean的初始化是在listener中声明的, 可以在后面使用.
Filter
- Servlet规范规定的,只能用于Web程序中, 由Servlet容器提供支持
- 作用于Servlet执行前后
@Order(1)
@WebFilter(filterName = "customized", urlPatterns = "/*")
public class CustomizedFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("CustomizedFilter Init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("CustomizedFilter doFilter before");
// 执行Servlet
filterChain.doFilter(servletRequest, servletResponse);
log.info("CustomizedFilter doFilter after");
}
@Override
public void destroy() {
log.info("CustomizedFilter destroy");
}
}
必须要注解ServletComponentScan才能让自定义的Filter其效果.
在filterChain.doFilter调用的前后来执行操作, 作用于Servlet之前的前后.
DispatcherServlet
为Spring框架定制的Servlet, 用来对请求进行处理
- 获取请求处理链HandlerExecutionChain
- 通过HandlerAdapter将请求发送给Controller进行处理
- 对视图进行解析并将Model传递给视图View, 生成response
Interceptor
- 作用于Handler/Controller前后执行
- 不能修改request
在spring中优先使用Interceptor
public class CustomizedInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("CustomizedInterceptor prehandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
log.info("CustomizedInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
log.info("CustomizedInterceptor afterCompletion");
}
}
// 添加interceptor
@Configuration
public class AppServiceConfig extends WebMvcConfigurationSupport {
@Autowired
private CustomizedInterceptor customizedInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customizedInterceptor).addPathPatterns("/**");
}
}
HandlerAdapter
- 请求流到POJO对象的转换
- 请求的handler方法调用
- ExceptionHandler异常统一处理
当使用RequestBoddy/ResponseBody注解时, Spring将使用HttpMessageConverter 对用户请求以及Handler的处理结果进行请求流和POJO对象之间的转换.
POJO对象转换的处理方式:
- HttpMessageConverter, spring框架的组件, 用于对body进行转换
- WebDataBinder的PropertyEditor, JDK的组件, 从字符串转换到具体的类型, 主要用于对PathVariable参数进行转换
- 自定义HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler来映射Controller中的方法参数和返回结果
当所有的参数没解析完毕后, POJO对象列表会被传递给handler方法, 用于获取handler方法中的对应参数.
Reference
Servlet规范:
参考文章:
- SpringMVC系列(一)核心:处理请求流程
- Spring Boot :Request请求处理流程
- Spring MVC工作流程以及请求处理流程
- 码农小汪-Spring MVC -DispatcherServlet 详解
- Servlet 工作原理解析
- Spring filter和拦截器(Interceptor)的区别和执行顺序
- Spring Boot 使用 Servlet、Filter、Listener
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- Spring MVC HandlerMapping HandlerAdapter
- SpringMVC中WebDataBinder的应用及原理
- 说说Spring中的WebDataBinder
- Spring Boot:定制HTTP消息转换器