Конфигурация приложений Kotlin: современные подходы и библиотеки
Грамотная конфигурация — залог гибкости и безопасности любого приложения. В экосистеме Kotlin разработчику доступен широкий спектр инструментов: от классических HOCON-файлов до мощных фреймворков с поддержкой DI. В этой статье мы разберём ключевые библиотеки, паттерны и лучшие практики управления конфигурацией в Kotlin-приложениях.
1. Typesafe Config (HOCON) — стандарт индустрии
Typesafe Config — самая популярная библиотека для конфигурации JVM-приложений. Она использует формат HOCON (Human-Optimized Config Object Notation), который поддерживает наследование, включение файлов и переменные окружения.
Подключение (Gradle)
dependencies {
implementation("com.typesafe:config:1.4.3")
}
Пример конфигурационного файла (application.conf)
app {
name = "MyKotlinApp"
version = "1.0.0"
database {
url = "jdbc:postgresql://localhost:5432/mydb"
user = ${?DB_USER} # переопределяется из env
password = ${?DB_PASSWORD}
}
features {
enableLogging = true
maxRetries = 3
}
}
Загрузка в Kotlin
import com.typesafe.config.ConfigFactory
fun main() {
val config = ConfigFactory.load()
val appName = config.getString("app.name")
val dbUrl = config.getString("app.database.url")
val retries = config.getInt("app.features.maxRetries")
println("App: $appName, DB: $dbUrl, Retries: $retries")
}
Преимущества: лёгкий, не требует DI, поддерживает ${?ENV_VAR} для подстановки переменных окружения. Отлично подходит для микросервисов и CLI-утилит.
2. Spring Boot + @ConfigurationProperties
Если вы используете Spring Boot, встроенная поддержка конфигурации через application.yml или application.properties — идеальный выбор. Библиотека автоматически маппит свойства на Kotlin data-классы.
Пример application.yml
app:
name: "SpringKotlinApp"
database:
url: "jdbc:mysql://localhost:3306/db"
pool-size: 10
retry:
enabled: true
max-attempts: 3
Kotlin data-класс для конфигурации
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "app")
data class AppConfig(
val name: String = "",
val database: DatabaseConfig = DatabaseConfig(),
val retry: RetryConfig = RetryConfig()
)
data class DatabaseConfig(
val url: String = "",
val poolSize: Int = 5
)
data class RetryConfig(
val enabled: Boolean = false,
val maxAttempts: Int = 1
)
Использование в сервисе
@Service
class UserService(private val config: AppConfig) {
fun printConfig() {
println("DB URL: ${config.database.url}")
println("Retry enabled: ${config.retry.enabled}")
}
}
Плюсы: интеграция с DI, валидация через @Validated, поддержка профилей (dev/prod). Минусы: привязка к Spring.
3. Ktor + HOCON (для Ktor-приложений)
Для серверных приложений на Kotor конфигурация часто строится через встроенный модуль HOCONApplicationConfig. Это легковесная альтернатива Spring.
Установка
dependencies {
implementation("io.ktor:ktor-server-core:2.3.0")
implementation("io.ktor:ktor-server-config-hocon:2.3.0")
}
Файл application.conf (Ktor)
ktor {
deployment {
port = 8080
host = "0.0.0.0"
}
application {
modules = [ "com.example.ApplicationKt.module" ]
}
custom {
apiKey = ${?API_KEY}
timeoutMs = 5000
}
}
Загрузка конфигурации в коде
fun Application.module() {
val config = environment.config
val port = config.property("ktor.deployment.port").getString()
val apiKey = config.propertyOrNull("custom.apiKey")?.getString() ?: "default"
println("Running on port $port, API key: $apiKey")
}
4. dotenv-kotlin — работа с .env файлами
Библиотека dotenv-kotlin загружает переменные из .env в систем