久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

<mvc:annotation-driven/>

 花千骨DC 2016-11-11

轉自:https://my.oschina.net/HeliosFly/blog/205343

一,、AnnotationDrivenBeanDefinitionParser

    通常如果我們希望通過注解的方式來進行Spring MVC開發(fā),我們都會在***-servlet.xml中加入<mvc:annotation-driven/>標簽來告訴Spring我們的目的,。但是我們?yōu)槭裁催@么做呢,?這個標簽是什么意思呢,?它做了什么呢,?

    同樣為了弄清楚這些問題,, 像<context:component-scan/>標簽一樣,,我們先找到它的解析類。第一篇文章中說過了,,所有的自定義命名空間(像mvc,,context等)下的標簽解析都是由BeanDefinitionParser接口的子類來完成的。參看第一篇文章中的圖片

我們看到有多個AnnotationDrivenBeanDefinitionParser,,他們是用來處理不同命名空間下的<annotation-driven/>標簽的,,我們今天研究的是<mvc:annotation-driven/>標簽,所以我們找到對應的實現(xiàn)類是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser,。
    通過閱讀類注釋文檔,,我們發(fā)現(xiàn)這個類主要是用來向工廠中注冊了

    上面幾個Bean實例。這幾個類都是用來做什么的呢,?

    前兩個是HandlerMapping接口的實現(xiàn)類,,用來處理請求映射的。其中第一個是處理@RequestMapping注解的,。第二個會將controller類的名字映射為請求url,。

    中間三個是用來處理請求的。具體點說就是確定調用哪個controller的哪個方法來處理當前請求,。第一個處理@Controller注解的處理器,,支持自定義方法參數(shù)和返回值(很酷)。第二個是處理繼承HttpRequestHandler的處理器,。第三個處理繼承自Controller接口的處理器,。

    后面三個是用來處理異常的解析器。

二,、實現(xiàn)

    光說無憑據(jù),,我們直接看代碼:

public BeanDefinition parse(Element element, ParserContext parserContext) {
        Object source = parserContext.extractSource(element);

        CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
        parserContext.pushContainingComponent(compDefinition);

        RuntimeBeanReference contentNegotiationManager = getContentNegotiationManager(element, source, parserContext);
        //第一個在這 RequestMappingHandlerMapping
        RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
        handlerMappingDef.setSource(source);
        handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        handlerMappingDef.getPropertyValues().add("order"0);
        handlerMappingDef.getPropertyValues().add("removeSemicolonContent"false);
        handlerMappingDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);
        String methodMappingName = parserContext.getReaderContext().registerWithGeneratedName(handlerMappingDef);
        //第二個在這 RequestMappingHandlerAdapter
        RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
        handlerAdapterDef.setSource(source);
        handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        handlerAdapterDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);
        handlerAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);
        handlerAdapterDef.getPropertyValues().add("messageConverters", messageConverters);
        if (element.hasAttribute("ignoreDefaultModelOnRedirect")) {
            Boolean ignoreDefaultModel = Boolean.valueOf(element.getAttribute("ignoreDefaultModelOnRedirect"));
            handlerAdapterDef.getPropertyValues().add("ignoreDefaultModelOnRedirect", ignoreDefaultModel);
        }
        if (argumentResolvers != null) {
            handlerAdapterDef.getPropertyValues().add("customArgumentResolvers", argumentResolvers);
        }
        if (returnValueHandlers != null) {
            handlerAdapterDef.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers);
        }
        if (asyncTimeout != null) {
            handlerAdapterDef.getPropertyValues().add("asyncRequestTimeout", asyncTimeout);
        }
        if (asyncExecutor != null) {
            handlerAdapterDef.getPropertyValues().add("taskExecutor", asyncExecutor);
        }
        handlerAdapterDef.getPropertyValues().add("callableInterceptors", callableInterceptors);
        handlerAdapterDef.getPropertyValues().add("deferredResultInterceptors", deferredResultInterceptors);
        String handlerAdapterName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef);
        //異常處理解析器
        RootBeanDefinition exceptionHandlerExceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class);
        exceptionHandlerExceptionResolver.setSource(source);
        exceptionHandlerExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        exceptionHandlerExceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);
        exceptionHandlerExceptionResolver.getPropertyValues().add("messageConverters", messageConverters);
        exceptionHandlerExceptionResolver.getPropertyValues().add("order"0);
        String methodExceptionResolverName =
                parserContext.getReaderContext().registerWithGeneratedName(exceptionHandlerExceptionResolver);
        //異常處理解析器
        RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class);
        responseStatusExceptionResolver.setSource(source);
        responseStatusExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        responseStatusExceptionResolver.getPropertyValues().add("order"1);
        String responseStatusExceptionResolverName =
                parserContext.getReaderContext().registerWithGeneratedName(responseStatusExceptionResolver);
        //異常處理解析器
        RootBeanDefinition defaultExceptionResolver = new RootBeanDefinition(DefaultHandlerExceptionResolver.class);
        defaultExceptionResolver.setSource(source);
        defaultExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        defaultExceptionResolver.getPropertyValues().add("order"2);
        String defaultExceptionResolverName =
                parserContext.getReaderContext().registerWithGeneratedName(defaultExceptionResolver);

        parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, methodMappingName));
        parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, handlerAdapterName));
        parserContext.registerComponent(new BeanComponentDefinition(exceptionHandlerExceptionResolver, methodExceptionResolverName));
        parserContext.registerComponent(new BeanComponentDefinition(responseStatusExceptionResolver, responseStatusExceptionResolverName));
        parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExceptionResolverName));
        parserContext.registerComponent(new BeanComponentDefinition(mappedCsInterceptorDef, mappedInterceptorName));
        //這里注冊了BeanNameUrlHandlerMapping,SimpleControllerHandlerAdapter等
        // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
        MvcNamespaceUtils.registerDefaultComponents(parserContext, source);

        parserContext.popAndRegisterContainingComponent();

        return null;
    }
//在這啊,。
public static void registerDefaultComponents(ParserContext parserContext, Object source) {
        registerBeanNameUrlHandlerMapping(parserContext, source);
        registerHttpRequestHandlerAdapter(parserContext, source);
        registerSimpleControllerHandlerAdapter(parserContext, source);
    }

    略長,,但很容易看明白的代碼,。看注釋我們發(fā)現(xiàn),,它的確注冊了上面說的那幾個類,。

三、總結

    我們知道了它們自動為我們注冊了這么多的Bean,,那這些Bean是做什么的呢,?

    我們主要說明里面的兩個,RequestMappingHandlerMapping和RequestMappingHandlerAdapter,。

    第一個是HandlerMapping的實現(xiàn)類,,它會處理@RequestMapping 注解,并將其注冊到請求映射表中,。(下片文章我們會詳細介紹的)

    第二個是HandlerAdapter的實現(xiàn)類,,它是處理請求的適配器,說白了,,就是確定調用哪個類的哪個方法,,并且構造方法參數(shù),返回值,。(后面文章也會陸續(xù)詳細介紹的)

    那么它跟<context:component-scan/>有什么區(qū)別呢,?其實想上篇文章中介紹的,<context:component-scan/>標簽是告訴Spring 來掃描指定包下的類,,并注冊被@Component,,@Controller,@Service,,@Repository等注解標記的組件,。

    而<mvc:annotation-scan/>是告知Spring,我們啟用注解驅動,。然后Spring會自動為我們注冊上面說到的幾個Bean到工廠中,,來處理我們的請求。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多