Skip to main content
Version: 4.2 - LTS

Starting Koin

This guide covers how to initialize the Koin container and configure it for your application.

The startKoin Function​

startKoin is the main entry point to launch Koin. It registers the container in GlobalContext, making it accessible throughout your application.

startKoin {
modules(appModule)
}

Once started, dependencies are ready for resolution via get() or by inject().

Configuration Options​

startKoin {
// Logging
logger(Level.INFO)

// Properties
environmentProperties()
fileProperties()
properties(mapOf("env" to "production"))

// Modules
modules(
coreModule,
networkModule,
dataModule
)

// Lazy modules (background loading)
lazyModules(analyticsModule, reportingModule)

// Create eager singletons
createEagerInstances()

// Override control
allowOverride(false)
}
OptionDescription
logger()Set logging level and implementation
modules()Load modules immediately
lazyModules()Load modules in background
properties()Load properties from map
fileProperties()Load from koin.properties file
environmentProperties()Load from system/environment
createEagerInstances()Create all createdAtStart singletons
allowOverride()Enable/disable definition overriding
info

startKoin can only be called once. To load additional modules later, use loadKoinModules().

Starting the Koin Container​

MethodUse Case
startKoin { }Standard apps - registers in GlobalContext
koinApplication { }Testing, SDKs, isolated contexts - local instance
koinConfiguration { }Configuration holder for dedicated APIs (Compose, Ktor)
tip

With the Koin Compiler Plugin, typed variants are available: startKoin<T>(), koinApplication<T>(), koinConfiguration<T>(). See Starting Koin with Compiler Plugin below.

startKoin - Global Instance​

Most common approach - starts Koin globally:

fun main() {
startKoin {
modules(appModule)
}

// Use anywhere
val service: MyService = get()
}

koinApplication - Isolated Instance​

Creates an isolated Koin instance (not in GlobalContext):

val myKoin = koinApplication {
modules(myModule)
}.koin

// Use the isolated instance
val service: MyService = myKoin.get()

Use cases:

  • Testing with isolated contexts
  • SDK development (avoid polluting host app)
  • Multiple Koin instances

koinConfiguration - Configuration Holder​

Creates a configuration to be used by dedicated APIs (Compose KoinApplication, Ktor plugin):

val config = koinConfiguration {
modules(appModule)
}

// Used by Compose KoinApplication, Ktor, etc.

Starting Koin with Compiler Plugin​

When using the Koin Compiler Plugin with annotations, you can use typed APIs to start Koin - no generated code needed.

info

This requires the Koin Compiler Plugin. Your application class must be annotated with @KoinApplication.

Define Your Application​

@Module
@Configuration
@ComponentScan("com.myapp")
class MyModule

@KoinApplication
class MyApp

Typed Startup APIs​

APIDescription
startKoin<T>()Start Koin globally with application T
startKoin<T> { }Start with application T and additional configuration
koinApplication<T>()Create isolated KoinApplication with T
koinConfiguration<T>()Create KoinConfiguration from T (for Compose, Ktor)

Where T is a class annotated with @KoinApplication.

Examples​

// Simple startup
startKoin<MyApp>()

// With additional configuration
startKoin<MyApp> {
printLogger()
}

// Isolated instance
val myKoin = koinApplication<MyApp>().koin

// Configuration for Compose/Ktor
val config = koinConfiguration<MyApp>()

Multi-Module Projects​

// feature/src/main/kotlin/FeatureModule.kt
@Module
@Configuration
@ComponentScan("com.myapp.feature")
class FeatureModule

// app/src/main/kotlin/MyApp.kt
@KoinApplication
class MyApp

// Start Koin
startKoin<MyApp>()

Platform Integrations​

Android​

class MainApplication : Application() {
override fun onCreate() {
super.onCreate()

startKoin {
androidLogger()
androidContext(this@MainApplication)
modules(appModule)
}
}
}

With Compiler Plugin:

@KoinApplication
class MyApp

class MainApplication : Application() {
override fun onCreate() {
super.onCreate()

startKoin<MyApp> {
androidLogger()
androidContext(this@MainApplication)
}
}
}

Compose​

Use KoinApplication composable with koinConfiguration:

@Composable
fun App() {
KoinApplication(
configuration = koinConfiguration { modules(appModule) }
) {
MainScreen()
}
}

With Compiler Plugin:

@KoinApplication
class MyApp

@Composable
fun App() {
KoinApplication(
configuration = koinConfiguration<MyApp>()
) {
MainScreen()
}
}

Ktor​

fun Application.module() {
install(Koin) {
slf4jLogger()
modules(appModule)
}
}

With Compiler Plugin:

@KoinApplication
class MyApp

fun Application.module() {
install(Koin) {
slf4jLogger()
withConfiguration<MyApp>()
}
}
info

See Ktor Integration for more details.

Kotlin Multiplatform​

Share configuration across platforms:

// commonMain
fun initKoin(config: KoinAppDeclaration? = null) {
startKoin {
config?.invoke(this)
modules(sharedModule)
}
}

// androidMain
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
initKoin {
androidContext(this@MainApplication)
androidLogger()
}
}
}

// iosMain
fun initKoinIos() = initKoin()

Dynamic Module Management​

Loading Modules After Startup​

// Initial startup
startKoin {
modules(coreModule)
}

// Later, load additional modules
loadKoinModules(featureModule)

Unloading Modules​

unloadKoinModules(featureModule)

Feature Toggle Example​

if (isFeatureEnabled) {
loadKoinModules(premiumFeatureModule)
}

// Later, if disabled
unloadKoinModules(premiumFeatureModule)

Stopping Koin​

Close the container and release resources:

stopKoin()

For isolated instances:

val koinApp = koinApplication { modules(myModule) }
koinApp.close()

Logging​

Enable Logging​

startKoin {
logger(Level.INFO) // Or DEBUG, WARNING, ERROR, NONE
}

Available Loggers​

LoggerPlatformDescription
EmptyLoggerAllNo logging (default)
PrintLoggerAllConsole output
AndroidLoggerAndroidAndroid Logcat
SLF4JLoggerJVMSLF4J integration

Platform-Specific Loggers​

// Android
startKoin {
androidLogger(Level.DEBUG)
}

// Ktor
install(Koin) {
slf4jLogger()
}

Properties​

Loading Properties​

startKoin {
// From environment
environmentProperties()

// From file (koin.properties)
fileProperties()

// From code
properties(mapOf(
"server_url" to "https://api.example.com",
"api_key" to "secret123"
))
}

Using Properties​

val appModule = module {
single {
ApiClient(
url = getProperty("server_url"),
key = getProperty("api_key", "default")
)
}
}

Best Practices​

  1. Call startKoin once - At application entry point
  2. Load critical modules immediately - Use modules()
  3. Use lazy modules - Defer non-critical with lazyModules()
  4. Enable logging in development - logger(Level.DEBUG)
  5. Use strict mode in production - allowOverride(false)
  6. Stop Koin between tests - Call stopKoin() to reset state

Next Steps​