springmvc 处理器映射器 适配器映射器处理流程核心代码分析-4

doget或者doPost进入doService方法

org.springframework.web.servlet.FrameworkServlet#doGet

org.springframework.web.servlet.FrameworkServlet#doPost

org.springframework.web.servlet.FrameworkServlet#doService

//核心的分发逻辑

org.springframework.web.servlet.DispatcherServlet#doDispatch

//最关键的几行代码

    // Determine handler for the current request.
                //根据请求获取处理器映射器
                mappedHandler = getHandler(processedRequest);
                if (mappedHandler == null) {
                    noHandlerFound(processedRequest, response);
                    return;
                }
​
                // Determine handler adapter for the current request.
                //根据处理器映射器来获取处理器适配器
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandler

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#getHandlerInternal

    protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {
        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
        request.setAttribute(LOOKUP_PATH, lookupPath);
        //注意这里加了一个读锁,作用:我猜测是防止高并发请求导致读到的请求url不一致,我也不肯定
        this.mappingRegistry.acquireReadLock();
        try {
            HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request);
            return (handlerMethod != null ? handlerMethod.createWithResolvedBean() : null);
        }
        finally {
            this.mappingRegistry.releaseReadLock();
        }
    }

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#lookupHandlerMethod

protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {
        List<Match> matches = new ArrayList<>();
        //根据请求的url来获取对应的HandlerMethod,注意这个mappingRegistry是我们之前分析的如何收集
        //controller过程,详见springmvc第二篇文章
        List<T> directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath);
        if (directPathMatches != null) {
            addMatchingMappings(directPathMatches, matches, request);
        }

如果第一个处理器映射器找不到的话,则去第二个处理器映射器寻找BeannameurlHandlerMapping

org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#getHandlerInternal

如果都找不到的话则报404,找到的话则通过反射调用自己的业务逻辑

适配器流程分析

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

这里处理器适配器的初始化和处理器映射器的初始化过程一模一样,在初始化9大组件的时候进行初始化的

    protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
        if (this.handlerAdapters != null) {
        //这里初始化了3个值,进行一一匹配,匹配成功返回处理器适配器
            for (HandlerAdapter adapter : this.handlerAdapters) {
                if (adapter.supports(handler)) {
                    return adapter;
                }
            }
        }
        throw new ServletException("No adapter for handler [" + handler +
                "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值