美文网首页spring bootSpring Boot 核心技术
SpringBoot2.2版本配置绑定是不是有点坑了?

SpringBoot2.2版本配置绑定是不是有点坑了?

作者: 恒宇少年 | 来源:发表于2019-12-02 14:42 被阅读0次

    SpringBoot版本升级兼容性一直做的不是多么的美丽,各个大分支之间由于底层使用的Srping版本不同,才导致的这种问题出现,而升级到2.2.1.RELEASE版本之后又遇到一个配置绑定的坑。

    免费教程专题

    恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。

    问题描述

    SpringBoot在升级到2.2.1.RELEASE版本后遇到了属性配置绑定的问题,我去找到SpringBoot版本发布的页面(Spring-Boot-2.2-Release-Notes)才了解到从2.2.1.RELEASE版本开始@SpringBootApplication注解已经不再添加@ConfigurationPropertiesScan支持,需要手动进行配置,这一点我们从源码上可以更清楚的看到。

    2.2.0.RELEASE

    SpringBoot 2.2.0.RELEASE版本中@SpringBootApplication注解部分源码如下所示:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    @ConfigurationPropertiesScan
    public @interface SpringBootApplication {
      //...
    }
    

    通过源码我们可以看到2.2.0.RELEASE版本的@SpringBootApplication注解默认添加了ConfigurationPropertiesScan注解,也就是默认开启了扫描@ConfigurationProperties注解的配置类,然后根据prefix进行属性绑定。

    2.2.1.RELEASE

    SpringBoot 2.2.1.RELEASE版本中@SpringBootApplication注解部分源码如下所示:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
        //...
    }
    

    我们发现在SpringBoot2.2.1.RELEASE版本的@SpringBootApplication注解中已经不再默认添加@ConfigurationPropertiesScan注解的支持了,也就是我们无法通过默认的配置实现扫描@ConfigurationProperties注解的类,也无法将application.yml/application.properties文件的配置内容与实体类内的属性进行绑定。

    解决问题

    SpringBoot官方给出的解决方法是手动在@SpringBootApplication注解的类上手动添加@ConfigurationPropertiesScan即可,如下所示:

    /**
     * 2.2.1.RELEASE版本属性绑定问题解决
     *
     * @author 恒宇少年
     */
    @SpringBootApplication
    @ConfigurationPropertiesScan
    public class SpringbootConfigurationBindingBitPittedApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootConfigurationBindingBitPittedApplication.class, args);
        }
    
    }
    

    敲黑板,划重点

    SpringBoot的每次中大版本升级往往会删除或者新增一些功能,建议大家关注SpringBoot的动态,以免出现类似今天这篇文章的问题,根据官方的文档及时做出调整。

    代码示例

    微信扫码下图二维码关注“程序员恒宇少年”后,回复“源码”即可获取源码仓库地址。

    本章节源码在spring-boot-chapter仓库内目录为springboot2-2-configuration-binding-bit-pitted

    作者个人 博客
    使用开源框架 ApiBoot 助你成为Api接口服务架构师

    相关文章

      网友评论

        本文标题:SpringBoot2.2版本配置绑定是不是有点坑了?

        本文链接:https://www.haomeiwen.com/subject/qlffgctx.html