如何在 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=library
和 ApplicationService::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
我可以将内部 Spring Boot 变量传递给 gradlew 吗?