" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

通過(guò)xml配置SpringMVC注解DispatcherServlet初始化過(guò)程解析

 更新時(shí)間:2023年10月12日 10:04:35   作者:福  
這篇文章主要為大家介紹了通過(guò)xml配置SpringMVC注解DispatcherServlet初始化過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

xml方式初始化DispatcherServle配置

通過(guò)xml方式初始化DispatcherServlet時(shí),xml文件中可以配置:

<mvc:annotation-driven />

或:

<mvc:annotation-driven >
        <!--設(shè)置響應(yīng)輸出字符集-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

表示對(duì)MVC注解的支持。

該標(biāo)簽的解析工作最終會(huì)由AnnotationDrivenBeanDefinitionParser的parse方法完成,parse方法主要完成以下工作

  • 注冊(cè)RequestMappingHandlerMapping的beanDefinition到WebApplication容器
  • 注冊(cè)RequestMappingHandlerAdapter的beanDefinition到WebApplication容器,同時(shí)從xml文件解析其messageConverters的定義(這也是xml文件中messageConverters生效的原因)
  • 注冊(cè)ExceptionHandlerExceptionResolver的beanDefinition到WebApplication容器
  • 注冊(cè)ResponseStatusExceptionResolver的beanDefinition到WebApplication容器
  • 注冊(cè)DefaultHandlerExceptionResolver的beanDefinition到WebApplication容器

根據(jù)beanDefinition創(chuàng)建對(duì)應(yīng)的bean

之后在容器refresh的過(guò)程中根據(jù)beanDefinition創(chuàng)建對(duì)應(yīng)的bean。

之后,在DispatcherServlet初始化的過(guò)程中,通過(guò)initStrategies初始化SpringMVC的相關(guān)“特殊類(lèi)型的Bean”:

protected void initStrategies(ApplicationContext context) {
        initMultipartResolver(context);
        initLocaleResolver(context);
        initThemeResolver(context);
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initHandlerExceptionResolvers(context);
        initRequestToViewNameTranslator(context);
        initViewResolvers(context);
        initFlashMapManager(context);
    }

比如initHandlerMappings方法:

private void initHandlerMappings(ApplicationContext context) {
        this.handlerMappings = null;
        if (this.detectAllHandlerMappings) {
            // Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
            //首先通過(guò)beanFactoryUtils從Spring容器中,通過(guò)類(lèi)型獲取
            Map<String, HandlerMapping> matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
            //如果從容器中獲取到了bean,放入到handlerMappings中
            if (!matchingBeans.isEmpty()) {
                this.handlerMappings = new ArrayList<>(matchingBeans.values());
                // We keep HandlerMappings in sorted order.
                AnnotationAwareOrderComparator.sort(this.handlerMappings);
            }
        }
        else {
            try {
                //通過(guò)名字和類(lèi)型從容器獲取
                HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
                this.handlerMappings = Collections.singletonList(hm);
            }
            catch (NoSuchBeanDefinitionException ex) {
                // Ignore, we'll add a default HandlerMapping later.
            }
        }
        // Ensure we have at least one HandlerMapping, by registering
        // a default HandlerMapping if no other mappings are found.
        if (this.handlerMappings == null) {
            //從容器中沒(méi)有獲取到,才調(diào)用getDefaultStrategies獲取默認(rèn)的、dispatcherServlet.properties文件中定義的
            this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
            if (logger.isTraceEnabled()) {
                logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
                        "': using default strategies from DispatcherServlet.properties");
            }
        }
    }

如果xml文件中不配置<mvc:annotation-driven />,也沒(méi)有 <mvc:default-servlet-handler />,則Spring容器中就不會(huì)有對(duì)應(yīng)的bean,這種情況下,才通過(guò)調(diào)用getDefaultStrategies方法,讀取DispatcherServlet.properties文件獲取該文件定義的默認(rèn)HandlerMappings,完成創(chuàng)建,當(dāng)然,創(chuàng)建后也會(huì)放入Spring容器:

protected Object createDefaultStrategy(ApplicationContext context, Class<?> clazz) {
        return context.getAutowireCapableBeanFactory().createBean(clazz);
    }

DefaultServletHandlerBeanDefinitionParser

xml文件中如果配置了 <mvc:default-servlet-handler />,SpringMVC啟動(dòng)時(shí)解析 <mvc:default-servlet-handler />標(biāo)簽過(guò)程中會(huì)調(diào)用DefaultServletHandlerBeanDefinitionParser,其parse方法會(huì)將SimpleUrlHandlerMapping以及BeanNameUrlHandlerMapping注入到WebApplicationContext容器中,目的是通過(guò)SimpleUrlHandlerMapping來(lái)處理"/**"請(qǐng)求(轉(zhuǎn)交給DefaultServletHttpRequestHandler)。

這個(gè)處理有個(gè)副作用:由于SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping作為handlerMappings注入到容器中,分析DispatcherServlet的初始化方法initHandlerMappings的源碼可知:

DispatcherServlet.properties文件中默認(rèn)的RequestMappingHandlerMapping不會(huì)被注入!

而RequestMappingHandlerMapping是具體負(fù)責(zé)SpringMVC注解解釋的,沒(méi)有了RequestMappingHandlerMapping,類(lèi)似@Controller等SpringMVC注解就不會(huì)生效。

所以,其實(shí)SpringMVC默認(rèn)情況下天生是可以支持SpringMVC注解的,只不過(guò)是 <mvc:default-servlet-handler />往往不可避免的需要配置(因?yàn)轫?xiàng)目中總有靜態(tài)資源需要展示),但是加了 <mvc:default-servlet-handler />會(huì)導(dǎo)致SpringMVC的注解失效!

因此導(dǎo)致了,正常的SpringMVC項(xiàng)目的以下兩項(xiàng)配置往往需要成對(duì)出現(xiàn):

<mvc:annotation-driven />
 <mvc:default-servlet-handler />

以上就是通過(guò)xml配置SpringMVC注解DispatcherServlet初始化過(guò)程解析的詳細(xì)內(nèi)容,更多關(guān)于xml配置SpringMVC注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java詳解實(shí)現(xiàn)ATM機(jī)模擬系統(tǒng)

    Java詳解實(shí)現(xiàn)ATM機(jī)模擬系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)控制臺(tái)版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解Spring Security中的HttpBasic登錄驗(yàn)證模式

    詳解Spring Security中的HttpBasic登錄驗(yàn)證模式

    HttpBasic登錄驗(yàn)證模式是Spring Security實(shí)現(xiàn)登錄驗(yàn)證最簡(jiǎn)單的一種方式,也可以說(shuō)是最簡(jiǎn)陋的一種方式,這篇文章主要介紹了Spring Security的HttpBasic登錄驗(yàn)證模式,需要的朋友可以參考下
    2019-11-11
  • Java中的關(guān)鍵字synchronized 詳解

    Java中的關(guān)鍵字synchronized 詳解

    這篇文章主要介紹了Java中的關(guān)鍵字synchronized,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java 中Map 的用法詳解

    Java 中Map 的用法詳解

    本文主要介紹java 中的Map 接口, 這里對(duì)Map 接口下的幾個(gè)類(lèi)做了詳細(xì)介紹,希望對(duì)學(xué)習(xí)java 編程的小伙伴有所幫助
    2016-07-07
  • SpringSecurity實(shí)現(xiàn)前后端分離登錄token認(rèn)證詳解

    SpringSecurity實(shí)現(xiàn)前后端分離登錄token認(rèn)證詳解

    目前市面上比較流行的權(quán)限框架主要實(shí)Shiro和Spring Security,這兩個(gè)框架各自側(cè)重點(diǎn)不同,各有各的優(yōu)劣,本文將給大家詳細(xì)介紹SpringSecurity如何實(shí)現(xiàn)前后端分離登錄token認(rèn)證
    2023-06-06
  • 解析Java的InputStream類(lèi)并借助其讀取ppt文件

    解析Java的InputStream類(lèi)并借助其讀取ppt文件

    這篇文章主要介紹了Java的InputStream類(lèi)并借助其讀取ppt文件,講到了InputStream類(lèi)中一些常用的方法的問(wèn)題,需要的朋友可以參考下
    2015-11-11
  • feignclient?https?接口調(diào)用報(bào)證書(shū)錯(cuò)誤的解決方案

    feignclient?https?接口調(diào)用報(bào)證書(shū)錯(cuò)誤的解決方案

    這篇文章主要介紹了feignclient?https?接口調(diào)用報(bào)證書(shū)錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • mybatis 在typeAliases別名時(shí)報(bào)錯(cuò)的解決

    mybatis 在typeAliases別名時(shí)報(bào)錯(cuò)的解決

    這篇文章主要介紹了mybatis 在typeAliases別名時(shí)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Springboot對(duì)多線程的支持

    詳解Springboot對(duì)多線程的支持

    Spring是通過(guò)任務(wù)執(zhí)行器(TaskExecutor)來(lái)實(shí)現(xiàn)多線程和并發(fā)編程,使用ThreadPoolTaskExecutor來(lái)創(chuàng)建一個(gè)基于線城池的TaskExecutor。這篇文章給大家介紹Springboot對(duì)多線程的支持,感興趣的朋友一起看看吧
    2018-07-07
  • 一文帶你掌握J(rèn)ava?ReentrantLock加解鎖原理

    一文帶你掌握J(rèn)ava?ReentrantLock加解鎖原理

    這篇文章將為大家詳細(xì)介紹一下Java中ReentrantLock?加鎖和釋放鎖的原理,以及和?Synchronized?的對(duì)比。文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助
    2022-12-12

最新評(píng)論