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

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

WBOY
Libérer: 2023-06-01 10:22:06
avant
839 Les gens l'ont consulté

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";
	// ... 省略代码
	}
Copier après la connexion

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;
		}
	}
Copier après la connexion

@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;
    		}
    	}
    Copier après la connexion
    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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal