如何在 application.properties 文件中覆盖 Spring Boot Starter 的默认属性?

Posted

技术标签:

【中文标题】如何在 application.properties 文件中覆盖 Spring Boot Starter 的默认属性?【英文标题】:How to override spring boot starter's default properties in application.properties file? 【发布时间】:2020-05-03 04:30:54 【问题描述】:

我创建了一个多模块 maven 项目,其中包含 library 模块(spring boot starter 应用程序)和application 模块(包含library 作为依赖项的spring boot 应用程序)。

这是我项目的结构:

.
├── application
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── kotlin
│       │   │   └── com
│       │   │       └── application
│       │   │           ├── ApplicationService.kt
│       │   │           └── Application.kt
│       │   └── resources
│       │       └── application.properties
│       └── test
│           └── kotlin
│               └── com
│                   └── application
│                       └── ApplicationServiceTest.kt
├── library
│   ├── pom.xml
│   └── src
│       └── main
│           ├── kotlin
│           │   └── com
│           │       └── application
│           │           ├── LibraryService.kt
│           │           └── Properties.kt
│           └── resources
│               ├── META-INF
│               │   └── spring.factories
│               └── config
│                   └── application.properties
└── pom.xml

库/.../Properties.kt:

@ConfigurationProperties("properties")
class Properties 
    lateinit var name: String

图书馆/.../LibraryService.kt:

@Service
@EnableConfigurationProperties(Properties::class)
class LibraryService(private val properties: Properties) 
    fun name() = properties.name

库/.../spring.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.application.LibraryService

库/.../config/application.properties:

properties.name=library

application/.../Application.kt

@SpringBootApplication
class Application

fun main(args: Array<String>) 
    runApplication<Application>(*args)

application/.../ApplicationService.kt

@Service
class ApplicationService(private val libraryService: LibraryService) 
    fun call() = libraryService.name()

application/.../application.properties

properties.name=application

所以,我有library 模块,我将application.properties 文件与默认参数properties.name=library 放在其中。 library 模块在LibraryService 中注入了Property 类。 LibraryService 有一个简单的方法name(),它只从属性中返回值。我也有application 模块,我在ApplicationService 中使用LibraryService 并调用name() 函数,但我在application 模块中有application.properties properties.name=application

我希望 application's properties.name=application 覆盖 library's properties.name=libraryApplicationService::call 必须返回值 application 而不是默认值 library in properties.name in library module。但这不会发生。 ApplicationService::call 返回值 library

我创建了简单的 junit 测试来重现此行为 (ApplicationServiceTest.kt):

@SpringBootTest
class ApplicationServiceTest 

    @Autowired
    lateinit var applicationService: ApplicationService

    @Test
    fun test() 
        println(applicationService.call())
    

它打印library。我希望有以下行为:library 有一些已定义的默认属性,但我希望能够覆盖application 中的一些属性。如何实现?

源码:https://github.com/grolegor/maven-multi-module-spring-starter

【问题讨论】:

你看过了吗:***.com/questions/52673216/… 【参考方案1】:

形成documentation

4.2.3. 应用程序属性文件 SpringApplication 从以下位置的 application.properties 文件中加载属性并将它们添加到 Spring 环境中:

1。当前目录的 /config 子目录

2。当前目录

3。一个类路径 /config 包

4。类路径根

列表按优先级排序(在列表中较高位置定义的属性会覆盖在较低位置中定义的属性。

所以在你的情况下[library] config/application.properties 将被使用,因为它比[application] application.properties 更高阶。

另外,你不能使用application.properties 两次。

查看您的存储库,我建议您从库模块中删除 /config/application.properties 并在您的 Properties-class 中提供默认值

package com.application

import org.springframework.boot.context.properties.ConfigurationProperties

@ConfigurationProperties("properties")
class Properties 
    var name: String = "library"


【讨论】:

我不明白为什么会这样。为什么library/.../config/application.properties 的顺序比application/.../application.properties 高? library 已添加到 application 作为 maven 依赖项。因此,library/.../config/application.properties 位于application 的类路径/config 包中,对吗? @grolegor 加载属性的顺序与maven无关。 我试图将library application.properties 移动到resources-文件夹下,但它对我不起作用,不幸的是,library 在这种情况下看不到任何属性,它会加载仅当 application.properties 位于 config 目录中时才具有属性。 为方便起见,我在github上发布了源代码:github.com/grolegor/maven-multi-module-spring-starter 将 library/config/application.properties 移动到资源中(记得用 maven 重建)

以上是关于如何在 application.properties 文件中覆盖 Spring Boot Starter 的默认属性?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 的 properties 属性值配置 application.properties 与 自定义properties

Jar不包含我的课程文件gitlab-ci

我可以将内部 Spring Boot 变量传递给 gradlew 吗?

logback-结合spring profile使用

日志记录:在 Spring Boot 中使用 log4j2.properties 文件实现 Log4j2

如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)