" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過xml配置SpringMVC注解DispatcherServlet初始化過程解析

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

xml方式初始化DispatcherServle配置

通過xml方式初始化DispatcherServlet時,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>

表示對MVC注解的支持。

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

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

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

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

之后,在DispatcherServlet初始化的過程中,通過initStrategies初始化SpringMVC的相關(guān)“特殊類型的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.
            //首先通過beanFactoryUtils從Spring容器中,通過類型獲取
            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 {
                //通過名字和類型從容器獲取
                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) {
            //從容器中沒有獲取到,才調(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 />,也沒有 <mvc:default-servlet-handler />,則Spring容器中就不會有對應(yīng)的bean,這種情況下,才通過調(diào)用getDefaultStrategies方法,讀取DispatcherServlet.properties文件獲取該文件定義的默認(rèn)HandlerMappings,完成創(chuàng)建,當(dāng)然,創(chuàng)建后也會放入Spring容器:

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

DefaultServletHandlerBeanDefinitionParser

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

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

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

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

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

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

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

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

相關(guān)文章

  • springboot如何靜態(tài)加載@configurationProperties

    springboot如何靜態(tài)加載@configurationProperties

    這篇文章主要介紹了springboot如何靜態(tài)加載@configurationProperties,本文一個錯誤案例和成功案例結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • springboot整合quartz實現(xiàn)定時任務(wù)示例

    springboot整合quartz實現(xiàn)定時任務(wù)示例

    spring支持多種定時任務(wù)的實現(xiàn)。我們來介紹下使用spring的定時器和使用quartz定時器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • springBoot2.6.2自動裝配之注解源碼解析

    springBoot2.6.2自動裝配之注解源碼解析

    對于springboot個人認(rèn)為它就是整合了各種組件,然后提供對應(yīng)的自動裝配和啟動器(starter),基于這個流程去實現(xiàn)一個定義的裝配組件,下面這篇文章主要給大家介紹了關(guān)于springBoot2.6.2自動裝配之注解源碼解析的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 關(guān)于SpringBoot配置文件application.properties的路徑問題

    關(guān)于SpringBoot配置文件application.properties的路徑問題

    這篇文章主要介紹了關(guān)于SpringBoot配置文件application.properties的路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java.lang.NoClassDefFoundError錯誤的原因及解決方法

    java.lang.NoClassDefFoundError錯誤的原因及解決方法

    這篇文章主要給大家介紹了關(guān)于java.lang.NoClassDefFoundError錯誤的原因及解決的相關(guān)資料,java.lang.NoClassDefFoundError是Java虛擬機(jī)在運(yùn)行時無法找到特定類的錯誤,需要的朋友可以參考下
    2023-10-10
  • Java實現(xiàn)軟件運(yùn)行時啟動信息窗口的方法

    Java實現(xiàn)軟件運(yùn)行時啟動信息窗口的方法

    這篇文章主要介紹了Java實現(xiàn)軟件運(yùn)行時啟動信息窗口的方法,比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • 如何使用Spring Boot ApplicationRunner解析命令行中的參數(shù)

    如何使用Spring Boot ApplicationRunner解析命令行中的參數(shù)

    這篇文章主要介紹了使用Spring Boot ApplicationRunner解析命令行中的參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • Java Swing JTextArea文本區(qū)域的實現(xiàn)示例

    Java Swing JTextArea文本區(qū)域的實現(xiàn)示例

    這篇文章主要介紹了Java Swing JTextArea文本區(qū)域的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Spring之什么是ObjectFactory?什么是ObjectProvider?

    Spring之什么是ObjectFactory?什么是ObjectProvider?

    這篇文章主要介紹了Spring之什么是ObjectFactory?什么是ObjectProvider?具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot之spring.factories的使用方式

    SpringBoot之spring.factories的使用方式

    這篇文章主要介紹了SpringBoot之spring.factories的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

晋宁县| 正镶白旗| 迭部县| 巢湖市| 东兴市| 衡阳市| 顺平县| 榆中县| 绩溪县| 昌宁县| 宝山区| 乡城县| 油尖旺区| 旌德县| 塔河县| 澄迈县| 阳城县| 花莲县| 关岭| 海安县| 芜湖市| 菏泽市| 名山县| 祁阳县| 谷城县| 蓝山县| 阿合奇县| 穆棱市| 江阴市| 宁武县| 杂多县| 大理市| 通山县| 四平市| 丰宁| 南投县| 鹿邑县| 嘉兴市| 蒙自县| 永兴县| 广州市|