Skip to content

啟動 Koin

Koin 是一個 DSL、一個輕量級容器和一個實用型 API。一旦您在 Koin 模組中宣告了您的定義,您就可以準備啟動 Koin 容器了。

startKoin 函數

startKoin 函數是啟動 Koin 容器的主要進入點。它需要一個 Koin 模組清單 才能執行。 模組載入後,定義即可由 Koin 容器解析。

啟動 Koin

kotlin
// start a KoinApplication in Global context
startKoin {
    // declare used modules
    modules(coffeeAppModule)
}

一旦呼叫 startKoin,Koin 將讀取您的所有模組和定義。Koin 隨後就可以處理任何 get()by inject() 呼叫以檢索所需的實例。

您的 Koin 容器可以有數個選項:

  • logger - 啟用日誌記錄 - 請參閱 <<logging.adoc#_logging,日誌記錄>> 區塊
  • properties()fileProperties()environmentProperties() 載入來自環境、koin.properties 檔案、額外屬性等的屬性 ... - 請參閱 <<properties.adoc#_lproperties,屬性>> 區塊

INFO

startKoin 無法呼叫超過一次。如果您需要從多個位置載入模組,請使用 loadKoinModules 函數。

啟動背後 - Koin 實例的內部運作

當我們啟動 Koin 時,我們會建立一個 KoinApplication 實例,它代表 Koin 容器的配置實例。一旦啟動,它將根據您的模組和選項產生一個 Koin 實例。 這個 Koin 實例隨後由 GlobalContext 持有,以便供任何 KoinComponent 類別使用。

GlobalContext 是 Koin 的預設 JVM 上下文策略。它由 startKoin 呼叫並註冊到 GlobalContext。這將使我們能夠從 Koin 多平台的角度註冊不同類型的上下文。

startKoin 之後載入模組

您無法呼叫 startKoin 函數超過一次。但您可以直接使用 loadKoinModules() 函數。

這個函數對於想要使用 Koin 的 SDK 開發者來說很有趣,因為他們不需要使用 startKoin() 函數,只需在其函式庫啟動時使用 loadKoinModules 即可。

kotlin
loadKoinModules(module1,module2 ...)

卸載模組

也可以卸載一批定義,然後使用指定的函數釋放它們的實例:

kotlin
unloadKoinModules(module1,module2 ...)

停止 Koin - 關閉所有資源

您可以關閉所有 Koin 資源並捨棄實例和定義。為此,您可以從任何地方使用 stopKoin() 函數來停止 Koin GlobalContext。 否則在 KoinApplication 實例上,只需呼叫 close()

日誌記錄

Koin 具有一個簡單的日誌記錄 API,用於記錄任何 Koin 活動(分配、查詢等)。日誌記錄 API 由以下類別表示:

Koin 日誌記錄器

kotlin
abstract class Logger(var level: Level = Level.INFO) {

    abstract fun log(level: Level, msg: MESSAGE)

    fun debug(msg: MESSAGE) {
        log(Level.DEBUG, msg)
    }

    fun info(msg: MESSAGE) {
        log(Level.INFO, msg)
    }

    fun error(msg: MESSAGE) {
        log(Level.ERROR, msg)
    }
}

Koin 根據目標平台提供了一些日誌記錄的實作:

  • PrintLogger - 直接日誌記錄到控制台(包含在 koin-core 中)
  • EmptyLogger - 不記錄任何內容(包含在 koin-core 中)
  • SLF4JLogger - 使用 SLF4J 記錄。由 Ktor 和 Spark 使用(koin-logger-slf4j 專案)
  • AndroidLogger - 日誌記錄到 Android 日誌記錄器(包含在 koin-android 中)

在啟動時設定日誌記錄

預設情況下,Koin 使用 EmptyLogger。您可以直接使用 PrintLogger 如下所示:

kotlin
startKoin {
    logger(LEVEL.INFO)
}

載入屬性

您可以在啟動時載入數種屬性:

  • 環境屬性 - 載入 系統 屬性
  • koin.properties 檔案 - 從 /src/main/resources/koin.properties 檔案載入屬性
  • 「額外」啟動屬性 - 傳遞給 startKoin 函數的值對映

從模組讀取屬性

確保在 Koin 啟動時載入屬性:

kotlin
startKoin {
    // Load properties from the default location
    // (i.e. `/src/main/resources/koin.properties`)
    fileProperties()
}

在 Koin 模組中,您可以透過其鍵獲取屬性:

在 /src/main/resources/koin.properties 檔案中

java
// Key - value
server_url=http://service_url

只需使用 getProperty 函數載入它:

kotlin
val myModule = module {

    // use the "server_url" key to retrieve its value
    single { MyService(getProperty("server_url")) }
}