Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法
原理概述
Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊(包含但不限于spring mvc核心類DispatcherServlet)來實(shí)現(xiàn)
那么springboot在什么時(shí)機(jī)向容器注入DispatcherServlet這個(gè)核心類的呢
注入的流程還是遵循了自動(dòng)裝配流程,在springboot框架里默認(rèn)提供了該自動(dòng)裝配的支持
在jar包里的spring.factories文件里有個(gè) org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration配置
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass(DispatcherServlet.class) @AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class) public class DispatcherServletAutoConfiguration { /* * The bean name for a DispatcherServlet that will be mapped to the root URL "/" */ public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet"; /* * The bean name for a ServletRegistrationBean for the DispatcherServlet "/" * public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration"; // ... 省略代碼 }
在DispatcherServletAutoConfiguration中有兩個(gè)內(nèi)部類(配置類) DispatcherServletConfiguration、DispatcherServletRegistrationConfiguration和兩個(gè)對(duì)應(yīng)的Condition類DefaultDispatcherServletCondition、DispatcherServletRegistrationCondition
DispatcherServletConfiguration
DispatcherServletConfiguration是DispatcherServletAutoConfiguration 的一個(gè)內(nèi)部類,并被 @Configuration標(biāo)注,會(huì)被容器自動(dòng)掃描到;其有兩個(gè)方法: 1、dispatcherServlet;2、multipartResolver
@Configuration(proxyBeanMethods = false) @Conditional(DefaultDispatcherServletCondition.class) @ConditionalOnClass(ServletRegistration.class) @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }) protected static class DispatcherServletConfiguration { // @A @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet(HttpProperties httpProperties, WebMvcProperties webMvcProperties) { DispatcherServlet dispatcherServlet = new DispatcherServlet(); dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest()); dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest()); dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound()); dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents()); dispatcherServlet.setEnableLoggingRequestDetails(httpProperties.isLogRequestDetails()); return dispatcherServlet; } // @B @Bean @ConditionalOnBean(MultipartResolver.class) @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) public MultipartResolver multipartResolver(MultipartResolver resolver) { // Detect if the user has created a MultipartResolver but named it incorrectly return resolver; } }
@A:
- @Configuration(proxyBeanMethods = false):配置類采用Lite模式
- @Conditional(DefaultDispatcherServletCondition.class):根據(jù)DefaultDispatcherServletCondition類返回值計(jì)算是否要注入,主要邏輯是檢驗(yàn)Spring容器中是否已經(jīng)存在一個(gè)名字為"dispatcherServlet"的DispatcherServlet
- @ConditionalOnClass(ServletRegistration.class):容器中必須要有ServletRegistration類
- @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }):加載HttpProperties和WebMvcProperties
@B:注入 MultipartResolver 解析類
DispatcherServletRegistrationConfiguration
該類注入的邏輯與DispatcherServletConfiguration 相同,只不過在類上注解了 @Import(DispatcherServletConfiguration.class)那么這兩個(gè)類定義就有了先后順序
@Configuration(proxyBeanMethods = false) @Conditional(DispatcherServletRegistrationCondition.class) @ConditionalOnClass(ServletRegistration.class) @EnableConfigurationProperties(WebMvcProperties.class) @Import(DispatcherServletConfiguration.class) //@A protected static class DispatcherServletRegistrationConfiguration { @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet, WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) { DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet, webMvcProperties.getServlet().getPath()); // 設(shè)置名稱 registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup()); multipartConfig.ifAvailable(registration::setMultipartConfig); return registration; } }
其中,DispatcherServletRegistrationBean繼承自ServletRegistrationBean,主要為DispatcherServlet提供服務(wù)。DispatcherServletRegistrationBean和DispatcherServlet都提供了注冊(cè)Servlet并公開DispatcherServletPath信息的功能
面試點(diǎn)
spring mvc和spring boot的關(guān)系,相信讀了上面的文章會(huì)說出一兩點(diǎn);
到此這篇關(guān)于Springboot自動(dòng)裝配之注入DispatcherServlet的文章就介紹到這了,更多相關(guān)Springboot注入DispatcherServlet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用MulticastSocket實(shí)現(xiàn)群聊應(yīng)用程序
這篇文章主要為大家詳細(xì)介紹了Java使用MulticastSocket實(shí)現(xiàn)群聊應(yīng)用程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05SpringBoot整合mysql、postgres及sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置實(shí)戰(zhàn)案例
在工作中業(yè)務(wù)的發(fā)展或業(yè)務(wù)數(shù)據(jù)隔離的場景下,通常需要一個(gè)項(xiàng)目中引入多個(gè)數(shù)據(jù)源,但SpringBoot默認(rèn)的自動(dòng)化配置是單數(shù)據(jù)源的,這篇文章主要給大家介紹了關(guān)于SpringBoot整合mysql、postgres及sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下2023-12-12使用webmagic實(shí)現(xiàn)爬蟲程序示例分享
這篇文章主要介紹了使用webmagic實(shí)現(xiàn)爬蟲程序示例,需要的朋友可以參考下2014-04-04springboot2.x只需兩步快速整合log4j2的方法
這篇文章主要介紹了springboot2.x只需兩步快速整合log4j2的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Java.toCharArray()和charAt()的效率對(duì)比分析
這篇文章主要介紹了Java.toCharArray()和charAt()的效率對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10java中實(shí)體類和JSON對(duì)象之間相互轉(zhuǎn)化
Java中關(guān)于Json格式轉(zhuǎn)化Object,Map,Collection類型和String類型之間的轉(zhuǎn)化在我們實(shí)際項(xiàng)目中應(yīng)用的很是普遍和廣泛。最近工作的過程中也是經(jīng)常有,因此,自己封裝了一個(gè)類分享給大家。2015-05-05Spring?Cloud?Gateway編碼實(shí)現(xiàn)任意地址跳轉(zhuǎn)
這篇文章主要介紹了Spring?Cloud?Gateway編碼實(shí)現(xiàn)任意地址跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2023-06-06