久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法

這篇文章主要介紹了Springboot自動(dòng)裝配之注入DispatcherServlet,Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊來(lái)實(shí)現(xiàn),那么springboot在什么時(shí)機(jī)向容器注入DispatcherServlet這個(gè)核心

原理概述

Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊(包含但不限于spring mvc核心類DispatcherServlet)來(lái)實(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 相同,只不過(guò)在類上注解了 @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并公開(kāi)DispatcherServletPath信息的功能

面試點(diǎn)

spring mvc和spring boot的關(guān)系,相信讀了上面的文章會(huì)說(shuō)出一兩點(diǎn);

到此這篇關(guān)于Springboot自動(dòng)裝配之注入DispatcherServlet的文章就介紹到這了,更多相關(guān)Springboot注入DispatcherServlet內(nèi)容請(qǐng)搜索html5模板網(wǎng)以前的文章希望大家以后多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 亚洲男人天堂 | 久久精品国产免费一区二区三区 | 国产一级片在线观看视频 | 久久精品网| 久久香焦 | 日韩色视频 | 亚洲国产高清免费 | 毛片一区二区三区 | 欧美mv日韩mv国产网站91进入 | 91久久精品一区二区三区 | 99国产精品99久久久久久粉嫩 | 国产一级片一区二区三区 | 亚洲免费视频在线观看 | 国产成人综合在线 | 色狠狠桃花综合 | 亚洲嫩草| 久久午夜剧场 | 欧美大片在线观看 | 日韩精品一区二区三区四区 | av中文字幕在线 | 色视频在线播放 | 日本一区二区三区视频在线 | 台湾av在线| 国产婷婷在线视频 | 福利片在线观看 | 欧美日一区| 国产精品久久片 | 国产精品久久久久一区二区三区 | 久草在线 | 桃色五月 | 亚洲福利av | 成年免费大片黄在线观看一级 | 中文字幕高清一区 | 国产精品电影在线观看 | 超碰美女在线 | 在线视频成人 | 看片地址 | 在线婷婷 | 国产精品成人一区 | 日韩国产精品一区二区三区 |