0
点赞
收藏
分享

微信扫一扫

深入Java日志框架及其最佳实践

妖妖妈 03-05 17:01 阅读 3

目录



一、SpringMVC的核心处理流程


二、DispatcherServlet


1、init()方法


2、doDispatch()方法

// 简化版
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 获取请求处理器(通过 HandlerMapping 建立请求URL和Handler方法之间的映射关系)
    // 遍历所有的处理器映射器,尝试从中找到适合当前请求的处理器,并返回执行链(HandlerExecutionChain)
    HandlerExecutionChain handler = getHandler(request);
    if (handler == null) {
        // 如果没有合适的处理器,返回 404 错误
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }

	// 应用请求预处理器
    if (!applyPreHandle(request, response, executionChain.getInterceptors())) {
        return;
    }

    // 找多Handler对应的请求处理器
    HandlerAdapter handlerAdapter = getHandlerAdapter(handler.getHandler());
    // 执行Handler方法
    handlerAdapter.handle(request, response, handler.getHandler());
 
 	// 应用请求后处理器
    applyPostHandle(request, response, executionChain.getInterceptors(), executionChain.getHandler());

	// 触发请求完成后的处理
    triggerAfterCompletion(request, response, null);


	protected boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors) throws Exception {
	    if (interceptors != null) {
	        // 遍历所有的请求预处理器(拦截器)
	        for (int i = 0; i < interceptors.length; i++) {
	            HandlerInterceptor interceptor = interceptors[i];
	            // 调用请求预处理器的preHandle()方法
	            if (!interceptor.preHandle(request, response, handler)) {
	                // 如果某个预处理器返回false,表示拦截请求,直接返回false
	                triggerAfterCompletion(request, response, null, new Exception("Interceptor[" + interceptor + "] preHandle return false"));
	                return false;
	            }
	        }
	    }
	    // 所有的预处理器都通过,返回true
	    return true;
    }


	protected void applyPostHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors, Object handler) throws Exception {
	    if (interceptors != null) {
	        // 逆序遍历所有的请求后处理器(拦截器)
	        for (int i = interceptors.length - 1; i >= 0; i--) {
	            HandlerInterceptor interceptor = interceptors[i];
	            // 调用请求后处理器的postHandle()方法
	            interceptor.postHandle(request, response, handler, null);
	        }
	    }
	}
}

3、AbstractAnnotationConfigDispatcherServletInitializer类

// 简化版
public abstract class AbstractAnnotationConfigDispatcherServletInitializer
        implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 创建根上下文
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        Class<?>[] rootConfigClasses = getRootConfigClasses();
        if (rootConfigClasses != null && rootConfigClasses.length > 0) {
            rootContext.register(rootConfigClasses);
        }

        // 创建 DispatcherServlet 上下文
        AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext();
        Class<?>[] servletConfigClasses = getServletConfigClasses();
        if (servletConfigClasses != null && servletConfigClasses.length > 0) {
            servletContext.register(servletConfigClasses);
        }

        // 注册 DispatcherServlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(servletContext);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
        dispatcher.addMapping(getServletMappings());

        // 添加额外的配置
        customizeRegistration(dispatcher);
    }

	// 用于配置 Spring 根上下文(即应用程序上下文)的配置类
    protected abstract Class<?>[] getRootConfigClasses();
    
	// 用于配置 DispatcherServlet 的上下文(即 Web 上下文)的配置类
    protected abstract Class<?>[] getServletConfigClasses();

	// 用于配置 DispatcherServlet 的映射
    protected abstract String[] getServletMappings();

    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    }
}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { ServletConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
举报

相关推荐

0 条评论