跳到主要内容

使用 @Module 的模块

在使用定义时,您可能需要将它们组织到模块中,或者不组织。您甚至可以完全不使用任何模块,而是使用生成的“默认”模块。

无模块 - 使用生成的默认模块

如果您不想指定任何模块,Koin 提供了一个默认模块来托管您的所有定义。 defaultModule可以直接使用:

// 使用 Koin 代码生成
import org.koin.ksp.generated.*

fun main() {
startKoin {
defaultModule()
}
}

// 或者

fun main() {
startKoin {
modules(
defaultModule
)
}
}
信息

别忘了使用 org.koin.ksp.generated.* 导入

使用 @Module 的类模块

要声明一个模块,只需使用 @Module 注解标记一个类:

@Module
class MyModule

要在 Koin 中加载您的模块,只需使用为任何 @Module 类生成的 .module 扩展。 只需创建模块的新实例 MyModule().module

// 使用 Koin 代码生成
import org.koin.ksp.generated.*

fun main() {
startKoin {
modules(
MyModule().module
)
}
}

别忘了使用 org.koin.ksp.generated.* 导入

使用 @ComponentScan 的组件扫描

要扫描并将带注解的组件收集到一个模块中,只需在模块上使用 @ComponentScan 注解:

@Module
@ComponentScan
class MyModule

这将扫描当前包和子包中的带注解的组件。 您可以指定要扫描的给定包 @ComponentScan("com.my.package")

信息

当使用 @ComponentScan 注解时,KSP 会遍历同一包的所有 Gradle 模块。(自 1.4 起)

类模块中的定义

要直接在类中定义一个定义,你可以使用定义注解来注解一个函数:

// 给定
// class MyComponent(val myDependency : MyDependency)

@Module
class MyModule {

@Single
fun myComponent(myDependency : MyDependency) = MyComponent(myDependency)
}

@InjectedParam, @Property 也可以在函数成员上使用

包含模块

要将其他类模块包含到您的模块中,只需使用 @Module 注解的 includes 属性:

@Module
class ModuleA

@Module(includes = [ModuleA::class])
class ModuleB

这样你就可以运行你的根模块了:

// 使用 Koin 代码生成
import org.koin.ksp.generated.*

fun main() {
startKoin {
modules(
// 将加载 ModuleB 和 ModuleA
ModuleB().module
)
}
}