• SpringBoot:转换器和格式化器及修改默认配置


    找到格式化转换器:

    @Bean
    @Override
    public FormattingConversionService mvcConversionService() {
        // 拿到配置文件中的格式化规则
        WebConversionService conversionService = 
            new WebConversionService(this.mvcProperties.getDateFormat());
        addFormatters(conversionService);
        return conversionService;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    点击去:

    public String getDateFormat() {
        return this.dateFormat;
    }
    
    /**
    * Date format to use. For instance, `dd/MM/yyyy`. 默认的
     */
    private String dateFormat;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到在我们的Properties文件中,我们可以进行自动配置它!

    如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则:

    spring.mvc.date-format=

    public void setDateFormat(String dateFormat){
    this.dateFormat=dateFormat;
    }
    
    • 1
    • 2
    • 3

    修改默认配置:
    通过源码探究,得出结论;
    编写一个@Configuration注解类,并且类型要为WebMvcConfigurer,还不能标注@EnableWebMvc注解;新建一个包叫config,写一个类MyMvcConfig:

    //应为类型要求为WebMvcConfigurer,所以我们实现其接口
    //可以使用自定义类扩展MVC的功能
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            // 浏览器发送/test , 就会跳转到test页面;
            registry.addViewController("/test").setViewName("test");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    分析:
    1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter

    2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)

    3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration

    
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
        private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
        
      // 从容器中获取所有的webmvcConfigurer
        @Autowired(required = false)
        public void setConfigurers(List<WebMvcConfigurer> configurers) {
            if (!CollectionUtils.isEmpty(configurers)) {
                this.configurers.addWebMvcConfigurers(configurers);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、在这个类中去寻找一个刚才设置的viewController当做参考,发现它调用了一个

    protected void addViewControllers(ViewControllerRegistry registry) {
        this.configurers.addViewControllers(registry);
    }
    
    • 1
    • 2
    • 3

    进一步点进去:

    
    public void addViewControllers(ViewControllerRegistry registry) {
        Iterator var2 = this.delegates.iterator();
    
        while(var2.hasNext()) {
            // 将所有的WebMvcConfigurer相关配置来一起调用!包括我们自己配置的和Spring给我们配置的
            WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
            delegate.addViewControllers(registry);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    发现所有的配置类都会被调用 不管是WebMvcConfiguration spring 还是自己手动的。

    全面接管SpringMVC:
    全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!

    只需在我们的配置类中要加一个@EnableWebMvc。一般不提倡全面接管。

  • 相关阅读:
    redis(封装jedis)-----面试
    CompletableFuture 异步编排
    【Pygame实战】你说神奇不神奇?吃豆人+切水果结合出一款你没玩过的新游戏!(附源码)
    (复刷) 面试题02.07.链表相交
    创建符合 Web 可访问性标准的 HTML 布局
    Vue + Element UI 前端篇(十一):第三方图标库
    C++设计模式---组合模式
    Spring 事务相关
    Oracle JDK 和 OpenJDK 有什么区别?
    AppAnalytics设备的分析服务
  • 原文地址:https://blog.csdn.net/yooppa/article/details/126432176