Koin の開始
このガイドでは、Koin コンテナを初期化し、アプリケーション用に設定する方法について説明します。
startKoin 関数
startKoin は Koin を起動するためのメインのエントリポイントです。これはコンテナを GlobalContext に登録し、アプリケーション全体からアクセス可能にします。
startKoin {
modules(appModule)
}一度起動すると、get() や by inject() を通じて依存関係を解決(resolution)できるようになります。
設定オプション
startKoin {
// ロギング
logger(Level.INFO)
// プロパティ
environmentProperties()
fileProperties()
properties(mapOf("env" to "production"))
// モジュール
modules(
coreModule,
networkModule,
dataModule
)
// 遅延モジュール (バックグラウンド読み込み)
lazyModules(analyticsModule, reportingModule)
// Eager シングルトンの作成
createEagerInstances()
// オーバーライドの制御
allowOverride(false)
}| オプション | 説明 |
|---|---|
logger() | ログレベルと実装を設定する |
modules() | モジュールを即座にロードする |
lazyModules() | バックグラウンドでモジュールをロードする |
properties() | Map からプロパティをロードする |
fileProperties() | koin.properties ファイルからロードする |
environmentProperties() | システム/環境変数からロードする |
createEagerInstances() | すべての createdAtStart シングルトンを作成する |
allowOverride() | 定義のオーバーライドの有効/無効を切り替える |
INFO
startKoin は 1回 しか呼び出すことができません。後で追加のモジュールをロードするには、loadKoinModules() を使用してください。
Koin コンテナの起動
| メソッド | ユースケース |
|---|---|
startKoin { } | 標準的なアプリ - GlobalContext に登録する |
koinApplication { } | テスト、SDK、隔離されたコンテキスト - ローカルインスタンス |
koinConfiguration { } | 専用 API 用の設定ホルダー (Compose, Ktor) |
TIP
Koin Compiler Plugin を使用すると、startKoin<T>()、koinApplication<T>()、koinConfiguration<T>() といった型指定されたバリアントが利用可能です。詳細は以下の Compiler Plugin を使用した Koin の開始 を参照してください。
startKoin - グローバルインスタンス
最も一般的なアプローチで、Koin をグローバルに開始します。
fun main() {
startKoin {
modules(appModule)
}
// どこでも使用可能
val service: MyService = get()
}koinApplication - 隔離されたインスタンス
(GlobalContext ではない)隔離された Koin インスタンスを作成します。
val myKoin = koinApplication {
modules(myModule)
}.koin
// 隔離されたインスタンスを使用する
val service: MyService = myKoin.get()ユースケース:
- 隔離されたコンテキストでのテスト
- SDK 開発(ホストアプリへの影響を避けるため)
- 複数の Koin インスタンスの保持
koinConfiguration - 設定ホルダー
専用の API(Compose の KoinApplication、Ktor プラグインなど)で使用される設定を作成します。
val config = koinConfiguration {
modules(appModule)
}
// Compose の KoinApplication や Ktor などで使用されるCompiler Plugin を使用した Koin の開始
アノテーションと共に Koin Compiler Plugin を使用すると、生成されたコードを意識することなく、型指定された API を使用して Koin を開始できます。
INFO
これには Koin Compiler Plugin が必要です。アプリケーションクラスに @KoinApplication アノテーションを付与する必要があります。
アプリケーションの定義
@Module
@Configuration
@ComponentScan("com.myapp")
class MyModule
@KoinApplication
class MyApp型指定された起動 API
| API | 説明 |
|---|---|
startKoin<T>() | アプリケーション T を使用して Koin をグローバルに開始する |
startKoin<T> { } | アプリケーション T と追加設定を使用して開始する |
koinApplication<T>() | T を使用して隔離された KoinApplication を作成する |
koinConfiguration<T>() | T から KoinConfiguration を作成する (Compose, Ktor 用) |
ここで T は @KoinApplication が付与されたクラスです。
例
// シンプルな起動
startKoin<MyApp>()
// 追加設定あり
startKoin<MyApp> {
printLogger()
}
// 隔離されたインスタンス
val myKoin = koinApplication<MyApp>().koin
// Compose/Ktor 用の設定
val config = koinConfiguration<MyApp>()マルチモジュールプロジェクト
// feature/src/main/kotlin/FeatureModule.kt
@Module
@Configuration
@ComponentScan("com.myapp.feature")
class FeatureModule
// app/src/main/kotlin/MyApp.kt
@KoinApplication
class MyApp
// Koin の開始
startKoin<MyApp>()プラットフォーム統合
Android
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidLogger()
androidContext(this@MainApplication)
modules(appModule)
}
}
}Compiler Plugin を使用する場合:
@KoinApplication
class MyApp
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin<MyApp> {
androidLogger()
androidContext(this@MainApplication)
}
}
}Compose
koinConfiguration と共に KoinApplication Composable を使用します。
@Composable
fun App() {
KoinApplication(
configuration = koinConfiguration { modules(appModule) }
) {
MainScreen()
}
}Compiler Plugin を使用する場合:
@KoinApplication
class MyApp
@Composable
fun App() {
KoinApplication(
configuration = koinConfiguration<MyApp>()
) {
MainScreen()
}
}Ktor
fun Application.module() {
install(Koin) {
slf4jLogger()
modules(appModule)
}
}Compiler Plugin を使用する場合:
@KoinApplication
class MyApp
fun Application.module() {
install(Koin) {
slf4jLogger()
withConfiguration<MyApp>()
}
}INFO
詳細は Ktor Integration を参照してください。
Kotlin Multiplatform
プラットフォーム間で設定を共有します。
// 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()動的なモジュール管理
起動後のモジュールのロード
// 最初の起動
startKoin {
modules(coreModule)
}
// 後で追加のモジュールをロードする
loadKoinModules(featureModule)モジュールのアンロード
unloadKoinModules(featureModule)機能トグル (Feature Toggle) の例
if (isFeatureEnabled) {
loadKoinModules(premiumFeatureModule)
}
// 後で無効になった場合
unloadKoinModules(premiumFeatureModule)Koin の停止
コンテナを閉じ、リソースを解放します。
stopKoin()隔離されたインスタンスの場合:
val koinApp = koinApplication { modules(myModule) }
koinApp.close()ロギング
ロギングの有効化
startKoin {
logger(Level.INFO) // または DEBUG, WARNING, ERROR, NONE
}利用可能なロガー
| ロガー | プラットフォーム | 説明 |
|---|---|---|
EmptyLogger | 全て | ログ出力なし (デフォルト) |
PrintLogger | 全て | コンソール出力 |
AndroidLogger | Android | Android Logcat |
SLF4JLogger | JVM | SLF4J 統合 |
プラットフォーム固有のロガー
// Android
startKoin {
androidLogger(Level.DEBUG)
}
// Ktor
install(Koin) {
slf4jLogger()
}プロパティ
プロパティのロード
startKoin {
// 環境変数から
environmentProperties()
// ファイルから (koin.properties)
fileProperties()
// コードから
properties(mapOf(
"server_url" to "https://api.example.com",
"api_key" to "secret123"
))
}プロパティの使用
val appModule = module {
single {
ApiClient(
url = getProperty("server_url"),
key = getProperty("api_key", "default")
)
}
}ベストプラクティス
startKoinは一度だけ呼び出す - アプリケーションのエントリポイントで行います。- 重要なモジュールは即座にロードする -
modules()を使用します。 - 遅延モジュールを活用する -
lazyModules()で重要度の低いもののロードを遅らせます。 - 開発中はロギングを有効にする -
logger(Level.DEBUG)を使用します。 - 本番環境では strict モードを使用する -
allowOverride(false)を設定します。 - テスト間では Koin を停止する - 状態をリセットするために
stopKoin()を呼び出します。
