菜鸟之路——Spring MVC(四)handlerMapping和handlerAdapter

本文详细探讨了Spring MVC中handlerMapping和Handleradapter的角色与工作原理,旨在通过理论结合部分源码分析,助读者深化对这两者在Spring MVC流程中的理解。
摘要由CSDN通过智能技术生成

      handlerMapping和handlerAdapter前面几篇文章或多或少都已经提及,此篇文章一方面是为了加深印象,另一方面通过部分源码再进一步了解深入。

一、Spring MVC中的handlerMapping

    我们知道Spring MVC 使用HandlerMapping来找到并保存url请求和处理函数间的mapping关系,即根据http请求选择合适的controller。以DefaultAnnotationHandlerMapping为例来具体看HandlerMapping的作用:DefaultAnnotationHandlerMapping将扫描当前所有已经注册的spring beans中的@requestmapping标注以找出url 和 handler method处理函数的关系并予以关联。 如果当前的HandlerMappign实现中没有能够满足你所需要的规则,可以通过实现HandlerMapping接口进行扩展。下面,就来看一下HandlerMapping相关的类图:
      
     在Spring MVC中,关于HandlerMapping的使用,主要包括两个部分:注册和查找。在HandlerMapping的实现中,持有一个handlerMap这样一个HashMap<String, Object>,其中key是http请求的path信息,value可以是一个字符串,或者是一个处理请求的HandlerExecutionChain,如果是String类型,则会将其视为Spring的bean名称。在HandlerMapping对象的创建中,IoC容器执行了一个容器回调方法setApplicationContext,在这个方法中调用initApplicationContext方法进行初始化,各个子类可以根据需求的不同重写这个方法。关于handlerMap信息的注册就是在initApplicationContext方法中被执行的。下面就来看一下注册url到controller映射信息的实现:
     SimpleUrlHandlerMapping中的注册实现代码:
protected void registerHandlers(Map<String, Object> urlMap) throws BeansException {  
        if (urlMap.isEmpty()) {  
            logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");  
        }  
        else {  
//urlMap信息是根据配置文件注入进来的  
            for (Map.Entry<String, Object> entry : urlMap.entrySet()) {  
                String url = entry.getKey();  
                Object handler = entry.getValue();  
                // Prepend with slash if not already present.  
                if (!url.startsWith("/")) {  
                    url = "/" + url;  
                }  
                // Remove whitespace from handler bean name.  
                if (handler instanceof String) {  
                    handler = ((String) handler).trim();  
                }  
                registerHandler(url, handler);  
            }  
        }  
    }  
    AbstractDetectingUrlHandlerMapping中的注册实现代码:
protected void detectHandlers() throws BeansException {  
        if (logger.isDebugEnabled()) {  
            logger.debug("Looking for URL mappings in application context: " + getApplicationContext());  
        }  
        String[] beanNames = (this.detectHandlersInAncestorContexts ?  
                BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :  
                getApplicationContext().getBeanNamesForType(Object.class));  
  
        // Take any bean name that we can determine URLs for.  
        for (String beanName : beanNames) {  
            String[] urls = determineUrlsForHandler(beanName);  
            if (!ObjectUtils.isEmpty(urls)) {  
                // URL paths found: Let's consider it a handler.  
                registerHandler(urls, beanName);  
            }  
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值