SpringBoot中对SpringMVC的自动配置详解

 更新时间:2023年10月27日 09:35:59   作者:夜聆离殇  
这篇文章主要介绍了SpringBoot中的SpringMVC自动配置详解,Spring MVC自动配置是Spring Boot提供的一种特性,它可以自动配置Spring MVC的相关组件,简化了开发人员的配置工作,需要的朋友可以参考下

一. SpringMVC自动配置

spring boot自动配置好了springmvc,以下是springboot对springmvc的自动配置(WebMvcAutoConfiguration.class)

1. Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

1) 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))

2) ContentNegotiatingViewResolver:组合所有的视图解析器的;

public View resolveViewName(String viewName, Locale locale) throws Exception {
        RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
        Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
        List<MediaType> requestedMediaTypes = getMediaTypes(((ServletRequestAttributes) attrs).getRequest());
        if (requestedMediaTypes != null) {
            List<View> candidateViews = getCandidateViews(viewName, locale, requestedMediaTypes);          //获取所有View
            View bestView = getBestView(candidateViews, requestedMediaTypes, attrs);                  //获得正确的View
            if (bestView != null) {
                return bestView;
            }
        }

3) 如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;

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.

1)Converter:转换器;例如: public String hello(User user):页面上类型转换使用Converter(表单属性能对应上User属性)

2)Formatter:格式化器;例如:日期格式化

@Override
        public void addFormatters(FormatterRegistry registry) {
            for (Converter<?, ?> converter : getBeansOfType(Converter.class)) {
                registry.addConverter(converter);
            }
            for (GenericConverter converter : getBeansOfType(GenericConverter.class)) {
                registry.addConverter(converter);
            }
            for (Formatter<?> formatter : getBeansOfType(Formatter.class)) {
                registry.addFormatter(formatter);
            }
        }

3)自己添加的格式化类型转化器,我们只需要放在容器中即可

6. Support for HttpMessageConverters (see below).

1)HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User---Json;

2)HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)

7. Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则

8. Automatic use of a ConfigurableWebBindingInitializer bean (see below).

我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)

@Override
        protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
            try {
                return this.beanFactory.getBean(ConfigurableWebBindingInitializer.class);
            }
            catch (NoSuchBeanDefinitionException ex) {
                return super.getConfigurableWebBindingInitializer();
            }
        }

二. 扩展SpringMVC

例如原先SpringMVC的配置文件中我们可以配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean></bean>
    </mvc:interceptor>
</mvc:interceptors>

在SpringBoot中我们是全注解式开发,因此我们如果;想实现拦截器的功能,则需要编写一个配置类@Configuration,是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc;

既保留了所有的自动配置,也能用我们扩展的配置;

//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能@Configurationpublic class MyMvcConfig extends WebMvcConfigurationSupport{
//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{
  @Autowired
  private UserTokenInterceptor userTokenInterceptor;
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(userTokenInterceptor).addPathPatterns("/**")
      .excludePathPatterns("/account/login","/account/register");
    super.addInterceptors(registry);
  }

}

原理:

1)WebMvcAutoConfiguration是SpringMVC的自动配置类

2)在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)

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

3)容器中所有的WebMvcConfigurer都会一起起作用;

4)我们的配置类也会被调用;效果:SpringMVC的自动配置和我们的扩展配置都会起作用;

三. 全面接管SpringMVC

SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置;所有的SpringMVC的自动配置都失效了

我们需要在配置类中添加@EnableWebMvc即可;

//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@EnableWebMvc
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    // super.addViewControllers(registry);
    //浏览器发送 /hello 请求来到 success
    registry.addViewController("/hello").setViewName("success");
  }
}

原理:

1)@EnableWebMvc的核心 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

2)

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
}

3)

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

4)@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

5)导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能; 

四. 如何修改SpringBoot的默认配置

1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;

如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;

2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

到此这篇关于SpringBoot中对SpringMVC的自动配置详解的文章就介绍到这了,更多相关SpringMVC自动配置详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java springboot探究配置文件优先级

    Java springboot探究配置文件优先级

    在springboot项目中,我们可以通过在yml文件中设置变量,再通过@Value注解来获得这个变量并使用,但如果这个项目已经部署到服务器上,我们想更改这个数据了需要怎么做呢,其实在springboot项目中,配置文件是有优先级的
    2023-04-04
  • Redis中的事务和Redis乐观锁详解

    Redis中的事务和Redis乐观锁详解

    这篇文章主要介绍了Redis中的事务和Redis乐观锁详解,Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断,需要的朋友可以参考下
    2023-12-12
  • java并发编程之进程和线程调度基础详解

    java并发编程之进程和线程调度基础详解

    这篇文章主要介绍了java并发编程之进程和线程调度基础,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 如何解决Mybatis-plus中@TableLogic注解失效问题

    如何解决Mybatis-plus中@TableLogic注解失效问题

    这篇文章主要介绍了如何解决Mybatis-plus中@TableLogic注解失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java事件机制要素及实例详解

    Java事件机制要素及实例详解

    这篇文章主要介绍了Java事件机制要素及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Springboot项目平滑关闭及自动化关闭脚本

    Springboot项目平滑关闭及自动化关闭脚本

    这篇文章主要为大家详细介绍了Springboot项目平滑关闭及自动化关闭脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 简单了解JAVA内存泄漏和溢出区别及联系

    简单了解JAVA内存泄漏和溢出区别及联系

    这篇文章主要介绍了简单了解JAVA内存泄漏和溢出区别及联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • jdbc实现连接和增删改查功能

    jdbc实现连接和增删改查功能

    这篇文章主要为大家详细介绍了jdbc实现连接和基本的增删改查功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Java中将String类型转换为int类型的几种常见方法

    Java中将String类型转换为int类型的几种常见方法

    在java中经常会遇到需要对数据进行类型转换的场景,这篇文章主要给大家介绍了关于Java中将String类型转换为int类型的几种常见方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Swagger中@API tags中含有中文异常问题的解决

    Swagger中@API tags中含有中文异常问题的解决

    这篇文章主要介绍了Swagger中@API tags中含有中文异常问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01

最新评论