中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot自動裝配之注入DispatcherServlet怎么實現

發布時間:2022-05-20 14:22:56 來源:億速云 閱讀:246 作者:iii 欄目:開發技術

這篇文章主要介紹“Springboot自動裝配之注入DispatcherServlet怎么實現”,在日常操作中,相信很多人在Springboot自動裝配之注入DispatcherServlet怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Springboot自動裝配之注入DispatcherServlet怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

原理概述

Springboot向外界提供web服務,底層依賴了springframework中的web模塊(包含但不限于spring mvc核心類DispatcherServlet)來實現

Springboot自動裝配之注入DispatcherServlet怎么實現

那么springboot在什么時機向容器注入DispatcherServlet這個核心類的呢
注入的流程還是遵循了自動裝配流程,在springboot框架里默認提供了該自動裝配的支持

在jar包里的spring.factories文件里有個 org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration配置

Springboot自動裝配之注入DispatcherServlet怎么實現

@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中有兩個內部類(配置類) DispatcherServletConfiguration、DispatcherServletRegistrationConfiguration和兩個對應的Condition類DefaultDispatcherServletCondition、DispatcherServletRegistrationCondition

DispatcherServletConfiguration

DispatcherServletConfiguration是DispatcherServletAutoConfiguration 的一個內部類,并被 @Configuration標注,會被容器自動掃描到;其有兩個方法: 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):根據DefaultDispatcherServletCondition類返回值計算是否要注入,主要邏輯是檢驗Spring容器中是否已經存在一個名字為"dispatcherServlet"的DispatcherServlet

  • @ConditionalOnClass(ServletRegistration.class):容器中必須要有ServletRegistration類

  • @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }):加載HttpProperties和WebMvcProperties

@B:注入 MultipartResolver 解析類

DispatcherServletRegistrationConfiguration

該類注入的邏輯與DispatcherServletConfiguration 相同,只不過在類上注解了 @Import(DispatcherServletConfiguration.class)那么這兩個類定義就有了先后順序

@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());
			// 設置名稱		
			registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
			registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
			multipartConfig.ifAvailable(registration::setMultipartConfig);
			return registration;
		}
	}

其中,DispatcherServletRegistrationBean繼承自ServletRegistrationBean,主要為DispatcherServlet提供服務。DispatcherServletRegistrationBean和DispatcherServlet都提供了注冊Servlet并公開DispatcherServletPath信息的功能

到此,關于“Springboot自動裝配之注入DispatcherServlet怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永安市| 阜阳市| 康平县| 泉州市| 时尚| 项城市| 淅川县| 曲阜市| 灵宝市| 山阴县| 邻水| 股票| 呼和浩特市| 区。| 鞍山市| 宣汉县| 体育| 临城县| 宁都县| 沙坪坝区| 南皮县| 翼城县| 波密县| 镇巴县| 金堂县| 长宁县| 合山市| 汉寿县| 永州市| 宿迁市| 大同县| 江津市| 鹤岗市| 商南县| 新余市| 海兴县| 泰宁县| 青海省| 肥西县| 项城市| 汉川市|