Конфигурация приложений Kotlin: библиотеки и подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Конфигурация приложений 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 в систем

Рекомендаций