springboot整合springMVC源码解读

官方文档对springMVC自动配置的介绍:

Spring Boot 提供了适用于大多数 Spring MVC 应用的自动配置(auto-configuration)。 自动配置在 Spring 默认功能上添加了以下功能: 引入 ContentNegotiatingViewResolver 和 BeanNameViewResolver bean。视图解析器。 支持服务静态资源,包括对 WebJar 的支持。 自动注册 Converter、GenericConverter 和 Formatter bean。 转换器:网页传入的数据封装成对象;格式化器:将日期转换为规定的格式。 支持 HttpMessageConverter。转换http请求和响应。 自动注册 MessageCodesResolver。 定义错误码生成规则。 支持静态 index.html。 支持自定义 Favicon。 自动使用 ConfigurableWebBindingInitializer bean。将请求树绑定到javabean中。

源码

在WebMvcAutoConfiguration类中,找到如下方法:

@Bean
		@ConditionalOnBean(ViewResolver.class)
		@ConditionalOnMissingBean(name = "viewResolver", value = ContentNegotiatingViewResolver.class)
		public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
          
   
			ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
			resolver.setContentNegotiationManager(beanFactory.getBean(ContentNegotiationManager.class));
			// ContentNegotiatingViewResolver uses all the other view resolvers to locate
			// a view so it should have a high precedence
			resolver.setOrder(Ordered.HIGHEST_PRECEDENCE);
			return resolver;
		}

编写一个自定义的视图控制器

如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC 配置(interceptor、formatter 和视图控制器等),可以添加自己的 WebMvcConfigurerAdapter 类型的 @Configuration 类,但不能带 @EnableWebMvc 注解。如果您想自定义 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 或者 ExceptionHandlerExceptionResolver 实例,可以声明一个 WebMvcRegistrationsAdapter 实例来提供这些组件。
package cn.xhh.study.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 视图控制器
 * @author Administrator
 */
@Configuration
public class MyConfig implements WebMvcConfigurer {
          
   
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
          
   
        registry.addViewController("/xie").setViewName("listener/online");
    }
}

通过localhost:8080/xie进行访问就会自动跳转到Controller的/listener/online中去

PS:在没有配置thymeleaf的时候,跳转到Controller的RequestMapping,配置了thymeleaf的时候,跳转到了具体的页面。

经验分享 程序员 微信小程序 职场和发展