Mam aplikację w Kotlin + Spring Boot, w której staram się ograniczyć użycie beanów do minimum.
Niektóre ustawienia aplikacji chce móc łatwo zmieniać przy uruchamianiu dlatego używam @ConfigurationProperties. Przykład:
@ConstructorBinding
@ConfigurationProperties(prefix = "myapp")
data class AllConfigurableProperties(val .....)
@Service
class TheOnlySpringService(properties: AllConfigurableProperties) {
val notBean = Class1()
fun someMethod() {
notBean.someMethod()
...
}
}
Class1 woła metodę Class2, Class2 metodę Class3....ClassN metodę Object1, Object1 metodę Object2 i tak do ObjectN.
Problem pojawia się gdy w ObjectN potrzebuję odczytać wartość z AllConfigurableProperties.
Jednym z rozwiązań jest zamiana wszystkich Object na Class i przekazywanie AllConfigurableProperties z TheOnlySpringService przez konstruktory aż do docelowego obiektu.
Tym sposobem za niedługo 90% klas będzie przyjmowało w konstruktorze AllConfigurableProperties tylko po to, żeby móc zmienić jakiś timeout/limit itp z command line'a.
Zastanawiam się nad alternatywnym rozwiązaniem i przychodzi mi do głowy coś takiego:
object ConfigurationHolder {
private lateinit var config: AllConfigurableProperties;
fun getConfig() = config
fun setConfig(conf: AllConfigurableProperties) {
config = conf
}
}
@Service
class TheOnlySpringService(properties: AllConfigurableProperties) {
init {
ConfigurationHolder.set(properties)
}
....
}
Co myślicie o takim rozwiązaniu? Jest jakiś lepszy sposób od tych zaproponowanych powyżej?