Skip to content

配置管理注意点

在使用 Spring Boot 时,理解依赖管理、属性覆盖以及资源文件过滤的机制是非常重要的。

1. 依赖管理注意点

  • 版本控制:当继承 spring-boot-starter-parent 或者导入 spring-boot-dependencies 时,Spring Boot 提供了一组默认的依赖版本。这些版本通常是最新的稳定版,并且经过了兼容性测试。如果你需要使用不同的版本,可以在 POM 文件中显式地指定。

  • 锁定版本:如果你希望确保所有开发者和构建环境都使用相同的依赖版本,可以考虑使用 dependencyManagement 来锁定版本号。这有助于避免由于不同环境中使用的依赖版本不同而导致的问题。

  • 自定义依赖:对于不在 Spring Boot 默认依赖列表中的库,你需要手动添加并指定版本。确保这些库与 Spring Boot 的其他部分兼容,尤其是当你引入新的框架或工具时。

2. 属性覆盖只对继承有效

  • 继承关系:当你继承 spring-boot-starter-parent 时,父 POM 中定义的 <properties> 元素会被子项目继承。这意味着你可以通过修改子项目的属性来覆盖父项目的默认值。但是,如果你选择导入 spring-boot-dependencies 而不是继承父 POM,则无法直接覆盖父 POM 中的属性,因为没有继承关系。

  • 解决方法:如果你选择了导入 spring-boot-dependencies,并且需要覆盖某些属性(例如 Java 版本),你可以直接在自己的 POM 文件中定义这些属性,它们将优先于 BOM 中提供的默认值。不过,需要注意的是,这种方式只能覆盖那些未被 spring-boot-dependencies 硬编码的属性。

3. 资源文件过滤问题

  • 启用过滤:默认情况下,Spring Boot 不会自动对资源文件(如 application.propertiesapplication.yml)进行占位符替换。如果你想要启用这种行为,可以在 POM 文件中配置 Maven 的资源插件来实现。
xml
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  • 占位符格式:在资源文件中使用 ${property} 格式的占位符,Maven 将会在打包过程中根据 POM 文件或其他配置源(如环境变量、命令行参数)中定义的属性值来替换这些占位符。

  • 多环境配置:为了支持不同环境下的配置,Spring Boot 支持基于 profile 的配置文件(如 application-dev.properties)。你可以通过激活特定的 profile 来加载相应的配置文件,从而实现更加灵活的资源配置。

  • 避免冲突:如果多个地方定义了相同的属性,可能会导致值覆盖的问题。遵循以下优先级顺序可以帮助避免这种情况:

    1. 命令行参数。
    2. 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON)。
    3. ServletConfig 初始化参数。
    4. ServletContext 初始化参数。
    5. Java 系统属性 (System.getProperties())。
    6. 操作系统环境变量。
    7. RandomValuePropertySource 配置的随机属性(仅限 random.* 属性)。
    8. 包含文件外的配置文件(通过 spring.config.location 指定)。
    9. JAR 包内部的配置文件(application.properties)。
    10. @Configuration 类上的 @PropertySource 注解。
    11. 默认属性(通过 SpringApplication.setDefaultProperties 指定)。

了解这些规则和技巧能够帮助你在使用 Spring Boot 时更好地管理和配置应用程序的依赖、属性和资源文件。正确处理这些问题可以使你的应用更健壮、易于维护,并且能够在不同的环境中顺利运行。