9、springmvc的自动配置

1、springmvc的自动配置

文档:https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-spring-mvc

 

WebMvcAutoConfiguration.java

复制代码
复制代码
Spring Boot 自动配置好了SpringMVC
以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration)
* 1、Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
    * 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
    * ContentNegotiatingViewResolver:组合所有的视图解析器的;
    * 如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;
* 2、Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars
* 3、Static index.html support. 静态首页访问
* 4、Custom Favicon support (see below). favicon.ico
* 5、自动注册了 of Converter, GenericConverter, Formatter beans. * Converter:转换器; public String hello(User user):类型转换使用Converter * Formatter 格式化器; 2017.12.17===Date; @Bean @ConditionalOnProperty(prefix = "spring.mvc", name = "date-format") //在文件中配置日期格式化的规则 public Formatter<Date> dateFormatter() { return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件 } 自己添加的格式化器转换器,我们只需要放在容器中即可
* 6、Support for HttpMessageConverters (see below). * HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User---Json; * HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter; 自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)
* 7、Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则
* 8、Automatic use of a ConfigurableWebBindingInitializer bean (see below). 我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器) 初始化WebDataBinder; 请求数据=====JavaBean; org.springframework.boot.autoconfigure.web:web的所有自动场景; 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 type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components. If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.
复制代码
复制代码

 

 

 2、扩展springmvc

复制代码
复制代码
<mvc:view-controller path="/hello" view-name="success"/>
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean></bean>
    </mvc:interceptor>
</mvc:interceptors>
复制代码
复制代码
复制代码
复制代码
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 type
WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of
RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver
you can declare a WebMvcRegistrationsAdapter instance providing such components. If you want to take complete control of Spring MVC, you can add your own
@Configuration annotated with @EnableWebMvc.
复制代码
复制代码

 

编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型(springboot2.0之后只需要实现WebMvcConfigurer接口就行了);

不能标注@EnableWebMvc; 

复制代码
复制代码
//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@Configuration
public class mvc implements WebMvcConfigurer {
@Override
   public void addViewControllers(ViewControllerRegistry registry) {
      //super.addViewControllers(registry);
      ///th是请求url
      registry.addViewController("/th").setViewName("th");
   }
}
复制代码
复制代码

 

原理:

1)、WebMvcAutoConfiguration是SpringMVC的自动配置类
2)、在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)
复制代码
    @Configuration
       public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
       private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

      //从容器中获取所有的WebMvcConfigurer
      @Autowired(required = false)
      public void setConfigurers(List<WebMvcConfigurer> configurers) {
          if (!CollectionUtils.isEmpty(configurers)) {
              this.configurers.addWebMvcConfigurers(configurers);
                //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用;  
                @Override
                // public void addViewControllers(ViewControllerRegistry registry) {
                //       for (WebMvcConfigurer delegate : this.delegates) {
                //      delegate.addViewControllers(registry);
                //   }
              }
          }
        }
复制代码
3)、容器中所有的WebMvcConfigurer都会一起起作用
4)、我们的配置类也会被调用;
效果:SpringMVC的自动配置和我们的扩展配置都会起作用;
 

 3、全面接管SpringMVC(不建议使用 

我们需要在配置类中添加@EnableWebMvc即可,SpringBoot对SpringMVC的自动配置都失效了,所有都是我们自己配置;

复制代码
//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@Configurationpublic class mvc  implements WebMvcConfigurer
{   @Override   
  
public void addViewControllers(ViewControllerRegistry registry) {    
   
//super.addViewControllers(registry);       
    ///th是请求url       
    registry.addViewController("/th").setViewName("th");   
  }
}
复制代码

 

为什么@EnableWebMvc自动配置就失效了
1)@EnableWebMvc的核心
EnableWebMvc 导入了DelegatingWebMvcConfiguration
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {

2)

DelegatingWebMvcConfigurationWebMvcConfigurationSupport的子类 
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

3)

容器中有WebMvcConfigurationSupport这个组件的时候,springboot中对springmvc的自动配置就失效
复制代码
复制代码
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
                WebMvcConfigurerAdapter.class })
// 容器中没有WebMvcConfiggurationSupport这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
                ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
复制代码
复制代码
4)、@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
5)、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

 

 
如何修改springboot的默认配置
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)
  如果有就用用户配置的,
       如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
posted @   Arbitrary233  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示