【发布时间】: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
【问题讨论】:
标签: java spring spring-boot maven kotlin