ホームページ >Java >&#&チュートリアル >DispatcherServletを注入してSpringboot自動アセンブリを実装する方法

DispatcherServletを注入してSpringboot自動アセンブリを実装する方法

WBOY
WBOY転載
2023-06-01 10:22:06823ブラウズ

原理の概要

Springboot は外部に Web サービスを提供し、最下層は SpringFramework の Web モジュール (Spring MVC コア クラス DispatcherServlet を含むがこれに限定されない) に依存して

## を実現します。

DispatcherServletを注入してSpringboot自動アセンブリを実装する方法

#では、springboot がコア クラス DispatcherServlet をコンテナーに注入するのはいつですか?

注入プロセスは引き続き自動アセンブリ プロセスに従い、自動アセンブリのサポートは springboot フレームワークでデフォルトで提供されます。 .

jar パッケージの spring.factories ファイルに org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration 構成があります

DispatcherServletを注入してSpringboot自動アセンブリを実装する方法

@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";
	// ... 省略代码
	}
## #Dispatcherserservletautoconfiguration(構成クラス)DispatcherServletConfiguration、DispatcherservletregistrationConfiguration、および2つの対応する条件クラスの2つの内部クラスがあります。 @configurationとコンテナによって自動的にスキャンされます。これには 2 つのメソッドがあります: 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) にアノテーションが付けられており、2 つのクラス定義にはシーケンスがあります
  • @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 は両方とも、サーブレットを登録し、DispatcherServletPath 情報を公開する機能を提供します。

以上がDispatcherServletを注入してSpringboot自動アセンブリを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。