Spring --- 请求处理流程

Amos Xia, 2018-05-14 02:17:09

  • Filter
  • DispatcherServlet
  • Interceptor
  • HandlerAdapter

web程序启动时的初始化顺序: ServletContext -> listener -> filter -> servlet

spring bean的初始化是在listener中声明的, 可以在后面使用.

workflow workflow-seq

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

workflow - 请求流到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规范:

参考文章:


知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。


Copyright© 2018 s2u2m