SpringBoot(17) —— 扩展springMVC

本文详细介绍了Spring Boot中日期格式的默认设置,包括date、time和dateTime的格式。此外,讨论了如何扩展视图解析器功能,通过覆盖`addViewControllers()`方法实现自定义视图跳转规则,避免额外的Controller方法。最后,解释了注解`@EnableWebMvc`的作用,强调在扩展配置时不应使用该注解,以免替换自动配置的WebMvc环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.日期格式设置

  • springBoot中自动配置springMVC还有一个特性为Formatter
    在这里插入图片描述
  • 说到格式,首先最让我们头疼就就是日期格式,我们可以去看看springBoot里日期格式默认是什么样的
  • 直接去WebMvcAutoConfiguration的配置类WebMvcProperties中看看日期默认格式
    @Deprecated
    @DeprecatedConfigurationProperty(replacement = "spring.mvc.format.date")
    public String getDateFormat() {
    	return this.format.getDate();
    }
    
    ==========================
    
    public String getDate() {
    	return this.date;
    }
    
    ==========================
    /**
     * Date format to use, for example `dd/MM/yyyy`.
     */
    private String date;
    
  • 显然,默认的年月日的格式为:dd/MM/yyyy
  • 在这个默认配置下面还有两个配置
    /**
     * Date format to use, for example `dd/MM/yyyy`.
     */
    private String date;
    
    /**
     * Time format to use, for example `HH:mm:ss`.
     */
    private String time;
    
    /**
     * Date-time format to use, for example `yyyy-MM-dd HH:mm:ss`.
     */
    private String dateTime;
    
  • 我们可以发现springBoot中默认的date(日期)、time(时间)和dateTime(日期时间) 3种格式的默认格式,所以在使用的时候如果我们没有在application中配置我们自定义的对应的格式,我们就必须遵守这3种格式来配置日期数据
  • 这个XXXproperties对应的属性值自动注入注解为@ConfigurationProperties(prefix = “spring.mvc”)
    在这里插入图片描述

2.扩展视图解析器功能

  • 就是我们自己在定义的有注解@configuration进行标注的,且实现了WebMvcConfigurer的类中覆写WebMvcConfigurer的addViewControllers(),以此为我们的视图新增我们指定的视图跳转规则
    在这里插入图片描述

  • 这个方法的功能和最初学习springMVC的时候学习controller的实现方法相似:实现controller接口,并且使用mv.setViewName()设置要跳转的视图名称,并且还要在spring容器中设置对应的url和controller的映射
    在这里插入图片描述
    在这里插入图片描述

  • 需要注意的是:这个方法并不是像第16篇博客中定义了一个视图解析器,它的作用只是在现有的视图解析器的基础上,增加了视图跳转映射

  • 具体实现方式就是前端请求的到达controller不变,controller返回指定的视图名称不变,但是视图解析器在返回对应的视图的时候,不会去找controller返回的视图名称的视图,而是在我们定义的这个映射中,找到映射的这个视图,数据渲染之后将视图返回给用户

  • 比如:registry.addViewController("/main.html").setViewName("/dashboard");

  • controller返回 return "redirect:/main.html";,但是视图解析器返回的视图将是dashboard


  • 实现方法addViewControllers()
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/test").setViewName("/index");
    }
    
  • 作用:前端请求localhost:8080/test,返回的视图将会是localhost:8080/index
  • 这个方法的优点就是将原来"实现controller接口,并且使用mv.setViewName()设置要跳转的视图名称"方法中在spring容器中设置url映射步骤放在了方法里面解决 (并不是一回事)
  • 定义这样的一个方法,就可以增强/扩展原来视图解析器的功能,原来默认的视图解析器必须设置对应的controller来映射视图名称才能实现跳转,现在直接在自定义的XXXconfig中就可以实现url和视图的关联,这就可以少写一个controller的方法
  • 测试

在这里插入图片描述


3.注解@EnableWebMvc

  • 在上一篇博客中我们说到了,如果想要扩展WebMvc的某一个配置,如上一篇博客中扩展了一个自定义的视图解析器,我们只需要定义一个类,实现接口WebMvcConfigurer,并在类上加上注解@Configuration进行标注,并最后重点注明了不要加上注解@EnableWebMvc,这样定义的一个类,才是默认的自动配置类WebMvcAutoConfiguration的功能扩展类,它会增强WebMvcAutoConfiguration的功能;如果加上了注解@EnableWebMvc,这个类就变成了替代自动配置类WebMvcAutoConfiguration的替代类,即替代了WebMvcAutoConfiguration
  • 那么这是为什么呢?
  • 查看注解@EnableWebMvc的定义
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Documented
    @Import({DelegatingWebMvcConfiguration.class})
    public @interface EnableWebMvc {
    }
    
  • 可以发现这个注解除了元注解之外只有一个注解@Import({DelegatingWebMvcConfiguration.class}),其他什么都没有做,所以我们可以说这个注解就是导入了一个类DelegatingWebMvcConfiguration的class对象,作用就是要通过反射实例化这个类
  • 我们再去看看类DelegatingWebMvcConfiguration的定义
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {}
    
  • 这个类继承了另一个类WebMvcConfigurationSupport
  • 这个类本身没有什么稀奇的,它的作用在我们的WebMvcAutoConfiguration类定义上的注解上
    //只截取了重要的定义部分
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    public class WebMvcAutoConfiguration {}
    
  • 我们可以看到自动配置类WebMvcAutoConfiguration 被加载的又一个条件:OnMissingBean,意思就是没有这个bean,就是没有这个类的实例化对象,这个类就是WebMvcConfigurationSupport
  • 到此我们就明白了为什么在扩展的时候不能使用注解@EnableWebMvc,因为它会导入类WebMvcConfigurationSupport的子类DelegatingWebMvcConfiguration,这样容器中就会存在WebMvcConfigurationSupport对象,那么我们的自动配置类WebMvcAutoConfiguration 就不会被加载到spring容器中,结果就是原来自动配置的webmvc环境都不会自动配置了,全部需要我们手动的进行配置

在这里插入图片描述

  • 可见它也继承了类DelegatingWebMvcConfiguration,这样不就进一步证实了我们自定义的标准了注解@EnableWebMvc的类是用来代替我们自动配置类WebMvcAutoConfiguration 的了吗?

4.小结

  • 在springBoot中,有很多的xxxConfig,注意:不是xxxAutoConfiguration ,这些类上面只要没有添加注解@Enablexxx,那它内部的bean就都是在帮助我们的xxxAutoConfiguration进行功能的扩展/扩充 ,那么它内部的@Bean和实现的接口的方法就会对springBoot对springMVC的默认配置进行增强/扩展
  • 如果加上了注解@Enablexxx,这个类的bean配置就是在代替原来的xxxAutoConfiguration的自动配置
  • 所以我们如果在springBoot相关项目中的代码中看到了xxxConfig,应该马上看看标注它的注解,判断这个类是在扩展自动配置类还是在代替自动配置类,一般很少有代替的
  • 所以我们一般看到xxxConfig之后,主要注意它为原有的xxxAutoConfiguration 增强/扩展了哪些功能即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值