Koin Core is a pragmatic lightweight dependency injection framework for Kotlin Multiplatform with iOS Simulator ARM64 target support.
—
This document covers how to set up and configure your Koin application using the KoinApplication class and related configuration utilities.
Koin applications are configured through the KoinApplication class, which serves as the main entry point for dependency injection setup. It manages module loading, configuration options, logging, and the overall application lifecycle.
import org.koin.dsl.koinApplication
// Create and configure a Koin application
fun koinApplication(
createEagerInstances: Boolean = true,
appDeclaration: KoinAppDeclaration? = null
): KoinApplication
fun koinApplication(appDeclaration: KoinAppDeclaration?): KoinApplication
fun koinApplication(configuration: KoinConfiguration?): KoinApplication
fun koinApplication(createEagerInstances: Boolean): KoinApplication
// Type aliases
typealias KoinAppDeclaration = KoinApplication.() -> Unitimport org.koin.dsl.*
// Simple application setup
val app = koinApplication {
modules(myModule)
}
// With custom configuration
val app = koinApplication(createEagerInstances = false) {
allowOverride(true)
printLogger()
modules(listOf(module1, module2))
}
// Access the Koin context
val koin = app.koinThe KoinApplication class provides all configuration capabilities for your dependency injection container.
class KoinApplication private constructor() {
val koin: Koin
companion object {
fun init(): KoinApplication
}
}Load your dependency modules into the application:
// Load single module
fun modules(modules: Module): KoinApplication
// Load multiple modules
fun modules(vararg modules: Module): KoinApplication
fun modules(modules: List<Module>): KoinApplicationimport org.koin.dsl.*
val appModule = module {
single<Repository> { DatabaseRepository() }
}
val networkModule = module {
single<ApiService> { RestApiService() }
}
// Load single module
val app = koinApplication {
modules(appModule)
}
// Load multiple modules
val app = koinApplication {
modules(appModule, networkModule)
// or
modules(listOf(appModule, networkModule))
}Control whether definitions can be overridden:
fun allowOverride(override: Boolean): Unitval app = koinApplication {
allowOverride(true) // Allow definition overrides
modules(myModule)
}Load application properties for dependency injection:
fun properties(values: Map<String, Any>): KoinApplicationval app = koinApplication {
properties(mapOf(
"db.url" to "jdbc:h2:mem:test",
"api.timeout" to 5000,
"debug.enabled" to true
))
modules(myModule)
}Configure Koin feature flags and options:
import org.koin.core.option.KoinOption
fun options(vararg optionValue: Pair<KoinOption, Any>): KoinApplicationimport org.koin.core.option.KoinOption
val app = koinApplication {
options(
KoinOption.CheckModules to true,
KoinOption.PrintLogger to Level.DEBUG
)
modules(myModule)
}Set up custom logging for Koin operations:
import org.koin.core.logger.Logger
fun logger(logger: Logger): KoinApplicationimport org.koin.core.logger.Logger
import org.koin.core.logger.Level
import org.koin.core.logger.MESSAGE
class CustomLogger : Logger() {
override fun display(level: Level, msg: MESSAGE) {
println("[$level] $msg")
}
}
val app = koinApplication {
logger(CustomLogger())
modules(myModule)
}Use the built-in print logger:
import org.koin.core.logger.Level
fun printLogger(level: Level = Level.INFO): KoinApplicationimport org.koin.core.logger.Level
val app = koinApplication {
printLogger(Level.DEBUG) // Enable debug logging
modules(myModule)
}Create singleton instances marked for eager initialization:
fun createEagerInstances(): Unitval eagerModule = module {
single<DatabaseConnection>(createdAtStart = true) {
DatabaseConnection()
}
}
val app = koinApplication {
modules(eagerModule)
createEagerInstances() // Creates DatabaseConnection immediately
}Close and cleanup resources:
fun close(): Unitval app = koinApplication { modules(myModule) }
// Use the application...
// Clean up when done
app.close()For reusable configuration blocks:
class KoinConfiguration(val config: KoinApplication.() -> Unit) {
operator fun invoke(): KoinApplication.() -> Unit
val appDeclaration: KoinApplication.() -> Unit
}
fun koinConfiguration(declaration: KoinAppDeclaration): KoinConfigurationimport org.koin.dsl.*
// Define reusable configuration
val databaseConfig = koinConfiguration {
properties(mapOf("db.url" to "jdbc:postgresql://localhost/mydb"))
modules(databaseModule)
}
val loggingConfig = koinConfiguration {
printLogger(Level.DEBUG)
}
// Apply configurations
val app = koinApplication {
includes(databaseConfig, loggingConfig)
modules(appModule)
}// Include KoinAppDeclaration configurations
fun KoinApplication.includes(vararg configurations: KoinAppDeclaration?): KoinApplication
// Include KoinConfiguration objects
fun KoinApplication.includes(vararg configurations: KoinConfiguration?): KoinApplication// Environment-specific configurations
val developmentConfig = koinConfiguration {
allowOverride(true)
printLogger(Level.DEBUG)
properties(mapOf("env" to "development"))
}
val productionConfig = koinConfiguration {
allowOverride(false)
printLogger(Level.ERROR)
properties(mapOf("env" to "production"))
}
// Application setup based on environment
val isProduction = System.getProperty("env") == "production"
val app = koinApplication {
includes(if (isProduction) productionConfig else developmentConfig)
modules(coreModules)
}When modules are loaded, Koin:
allowOverride settingclass AppConfiguration {
companion object {
fun create(environment: String): KoinConfiguration = when (environment) {
"test" -> koinConfiguration {
allowOverride(true)
modules(testModules)
}
"production" -> koinConfiguration {
allowOverride(false)
printLogger(Level.ERROR)
modules(productionModules)
}
else -> koinConfiguration {
printLogger(Level.DEBUG)
modules(developmentModules)
}
}
}
}// Organize by feature
val databaseConfig = koinConfiguration {
modules(databaseModule, migrationModule)
}
val networkConfig = koinConfiguration {
modules(apiModule, httpModule)
}
val uiConfig = koinConfiguration {
modules(viewModelModule, adapterModule)
}
val app = koinApplication {
includes(databaseConfig, networkConfig, uiConfig)
}// Load from external sources
val properties = loadPropertiesFromFile("application.properties")
val app = koinApplication {
properties(properties)
modules(appModule)
}This setup system provides flexible, composable application configuration while maintaining clean separation of concerns across different application layers and environments.
Install with Tessl CLI
npx tessl i tessl/maven-io-insert-koin--koin-core-iossimulatorarm64