spring boot扩展spring mvc原理分析
我们都知道spring boot自动配置了各种场景所需要的组件,包括web模块,
虽然帮我们导入了许多组件,但这些配置在实际开发中满足不了我们的需要,因此我们需要在自动配置的基础上进一步扩展spring mvc
- 截取自Spring Boot官方文档
If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own
@Configuration
class of typeWebMvcConfigurerAdapter
, but without@EnableWebMvc
. If you wish to provide custom instances ofRequestMappingHandlerMapping
,RequestMappingHandlerAdapter
orExceptionHandlerExceptionResolver
you can declare aWebMvcRegistrationsAdapter
instance providing such components.
If you want to take complete control of Spring MVC, you can add your own@Configuration
annotated with@EnableWebMvc
.
1.扩展
根据官方文档的定义,如果我们想要扩展MVC,只需要自己编写一个配置类,并且这个类是属于WebMvcConfigurerAdapter
,并且不能被@EnableWebMvc
标注,在spring boot2.0.0及以上,可以不用继承WebMvcConfigurerAdapter
,只需要实现WebMvcConfigurer
接口,选择方法进行重写即可,下面是一个案例
//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//浏览器发送 /test请求来到 success
registry.addViewController("/test").setViewName("success");
}
}
这样就注册了一个视图映射器,既保留了所有的自动配置,也能用我们扩展的配置
2.原理
- 在
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
中,WebMvcAutoConfiguration是SpringMVC的自动配置类 - 在做其他自动配置时会导入;
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@Configuration(
proxyBeanMethods = false
)
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
我们看一下EnableWebMvcConfiguration.class
- 容器中所有的WebMvcConfigurer都会一起起作用
- 我们的类也会起作用
效果:SpringMVC的自动配置和我们的扩展配置都会起作用;
推荐阅读
-
spring boot与spring mvc的区别及功能介绍
-
spring boot jar的启动原理解析
-
Spring Cloud动态配置实现原理与源码分析
-
Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结
-
Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析
-
从原理层面掌握@SessionAttribute的使用【一起学Spring MVC】
-
Spring-AOP本质原理分析(七)
-
spring MVC扩展和SSM整合