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的时候,跳转到了具体的页面。
