Maison  >  Article  >  Java  >  Comment implémenter l'assemblage automatique Springboot en injectant DispatcherServlet

Comment implémenter l'assemblage automatique Springboot en injectant DispatcherServlet

WBOY
WBOYavant
2023-06-01 10:22:06806parcourir

Principe Overview

Springboot fournit des services Web au monde extérieur. La couche inférieure s'appuie sur le module Web de springframework (y compris, mais sans s'y limiter, la classe principale Spring mvc DispatcherServlet) pour implémenter #🎜🎜 #

Comment implémenter lassemblage automatique Springboot en injectant DispatcherServlet

Alors, quand Springboot injecte-t-il la classe principale DispatcherServlet dans le conteneur

Le processus d'injection suit toujours le processus d'assemblage automatique, qui est fourni par défaut dans le support du framework springboot

Il existe une configuration org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration dans le fichier spring.factories du package jar

#🎜🎜 ##🎜 🎜#
@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";
	// ... 省略代码
	}

Il existe deux classes internes (classes de configuration) dans DispatcherServletAutoConfiguration DispatcherServletConfiguration, DispatcherServletRegistrationConfiguration et deux classes de condition correspondantes DefaultDispatcherServletCondition, DispatcherServletRegistrationConditionComment implémenter lassemblage automatique Springboot en injectant DispatcherServlet

DispatcherServletConfiguration# 🎜 🎜#

DispatcherServletConfiguration Il s'agit d'une classe interne de DispatcherServletAutoConfiguration et est marquée par @Configuration et sera automatiquement analysée par le conteneur ; elle a deux méthodes : 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) : La classe de configuration adopte le mode Lite

  • @Conditional(DefaultDispatcherServletCondition.class) : Selon DefaultDispatcherServletCondition La logique principale pour calculer si la valeur de retour de la classe doit être injectée est de vérifier s'il existe déjà un DispatcherServlet nommé "dispatcherServlet" dans le conteneur Spring

  • #🎜🎜 #@ConditionalOnClass(ServletRegistration.class) : Il doit y avoir une classe ServletRegistration dans le conteneur
  • @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }) : Charger HttpProperties et WebMvcProperties
  • #🎜🎜 ## 🎜🎜#

    @B : Injecter la classe d'analyse MultipartResolver

  • DispatcherServletRegistrationConfiguration
  • La logique injectée de cette classe est la identique à celle de DispatcherServletConfiguration, sauf que la classe est annotée avec @Import( DispatcherServletConfiguration.class) Ensuite les deux définitions de classe sont dans l'ordre

    @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;
    		}
    	}
  • Parmi elles, DispatcherServletRegistrationBean hérite de ServletRegistrationBean et fournit principalement des services pour DispatcherServlet . DispatcherServletRegistrationBean et DispatcherServlet fournissent tous deux la fonction d'enregistrement du servlet et d'exposition des informations DispatcherServletPath

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer