[Spring MVC] Principio de MVC: inicialización de DispatcherServlet, la inicialización significa que MVC está listo


Tener el DispatcherServlet listo significa que el servidor está listo para manejar la solicitud, entonces, ¿cómo se inicializa el DispatcherServlet?

1. @EnableWebMVC activa la función MVC

En Spring MVC, puede habilitar la función MVC pegando esta anotación. Spring Boot ya se inicia tan pronto como se introduce el iniciador web.

Nota: Sin embargo, use esta anotación con precaución en Spring Boot. Esta anotación hará que el ensamblaje automático de Spring Boot falle y que todos los componentes mejorados de Boot fallen, lo que hará que la función se degrade a MVC.

2. Inicializar componentes MVC personalizados

Descripción general del proceso de trabajo:
1. Inicialice cada bean definido en WebMvcConfigurationSupport
2. La inicialización de cada bean desencadena la llamada de cada método de DelegatingWebMvcConfiguration
3. La llamada del método desencadena la llamada de WebMvcConfigurer
4. WebMvcConfigurer es la configuración definida por el usuario

2.1 Proceso

  • Una vez iniciado el contenedor, comenzará el proceso de inicialización del bean.

La inicialización de beans relacionados con mvc en realidad no tiene nada que ver entre sí: cada uno inicializa el suyo y está bien. Pero cuando se inicializa en el Bean definido en WebMvcConfigurationSupport, activará la llamada de cada método de la clase DelegatingWebMvcConfiguration; la llamada al método está asociada con WebMvcConfigurer, y WebMvcConfigurer está asociada con nuestro componente, y finalmente se inicializará.

  • Inicialice los beans definidos en WebMvcConfigurationSupport
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
    
    

    ......
    @Bean
	public RequestMappingHandlerMapping requestMappingHandlerMapping()

    ......
    
    @Bean
	public PathMatcher mvcPathMatcher() {
    
    }
    ......
    
}
  • La inicialización del bean conduce a la ejecución de cada método de DelegatingWebMvcConfiguration
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    
    
	
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

	@Autowired(required = false)
	public void setConfigurers(List<WebMvcConfigurer> configurers) {
    
    
		if (!CollectionUtils.isEmpty(configurers)) {
    
    
			this.configurers.addWebMvcConfigurers(configurers);
		}
	}
    
    @Override
	protected void configurePathMatch(PathMatchConfigurer configurer) {
    
    
		this.configurers.configurePathMatch(configurer);
	}

	@Override
	protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    
    
		this.configurers.configureContentNegotiation(configurer);
	}

	.........
}
  • La ejecución de cada método hace que WebMvcConfigurer entre en vigor.
  • Los usuarios pueden personalizar los componentes mvc heredando WebMvcConfigurer, y los componentes personalizados entrarán en vigor.

2.2 Cómo analizar el registro complejo de componentes Spring

Cómo analizar componentes Spring complejos con la relación de herencia @Bean: https://www.yuque.com/yuchangyuan/kkc8mp/ot7orhqpmmqictqx

3. DispatcherServlet se inicializará después de que se inicie el contenedor.

Después de iniciar el contenedor, se inicializará DispatcherServlet y todos los beans relacionados con MVC se establecerán en las propiedades de DispatcherServlet. Después de eso, solo necesitará usar las propiedades para procesar solicitudes.

protected void initStrategies(ApplicationContext context) {
    
    
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
    initFlashMapManager(context);
}
  • Pregunta: ¿No había muchos tipos de frijoles en la etapa anterior de autoensamblaje? ¿Por qué ahora hay tantos tipos?

Porque cada componente está integrado en estos 9 tipos de frijoles.

4. Resumen del proceso de inicialización de DispatcherServlet

1. Active la función MVC

Spring Boot solo necesita presentar el iniciador.

2. Registre los componentes mvc relacionados en el contenedor mediante el método @Bean

La personalización del usuario generalmente se implementa implementando WebMvcConfiguration

3. Inicialización de la clase principal del componente mvc (importante y difícil): WebMvcConfigurationSupport
4. Ejecute el método initStrategies de DispatcherServlet para establecer las propiedades
5. Hasta que DispatcherServlet esté listo, MVC estará listo
6. Las solicitudes http posteriores se pueden procesar directamente en DispatcherServlet.

1. Primero el método de servicio (este método preparará algunas cosas)
2. Luego el método doDispatcher (el método principal para procesar solicitudes)

Supongo que te gusta

Origin blog.csdn.net/yuchangyuan5237/article/details/133525811
Recomendado
Clasificación