设计思路
- 定义注解:创建用于标记依赖关系的注解,比如
@Dependency
,用于标记需要注入的依赖。
- 使用反射:在运行时通过反射获取类的所有字段,检查哪些字段标记了依赖注解,然后进行依赖注入。
- 依赖管理:使用一个容器来管理所有的依赖实例,保证依赖的单例性和高效获取。
- 性能优化:为减少反射带来的性能开销,可以采用缓存策略,缓存已经处理过的类的依赖注入信息。
- 可维护性:通过模块化设计,将依赖注入逻辑封装在独立的模块中,便于理解和维护。
关键代码实现
- 定义注解
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD)
annotation class Dependency
- 依赖容器
object DependencyContainer {
private val dependencies = mutableMapOf<Class<*>, Any>()
fun <T> registerDependency(clazz: Class<T>, instance: T) {
dependencies[clazz] = instance
}
fun <T> getDependency(clazz: Class<T>): T? = dependencies[clazz] as? T
}
- 依赖注入逻辑
fun injectDependencies(instance: Any) {
val classType = instance::class.java
classType.declaredFields.forEach { field ->
field.isAccessible = true
if (field.isAnnotationPresent(Dependency::class.java)) {
val dependencyType = field.type
val dependency = DependencyContainer.getDependency(dependencyType)
if (dependency != null) {
field.set(instance, dependency)
} else {
throw RuntimeException("Dependency not found for ${dependencyType.name}")
}
}
}
}
- 使用示例
class ModuleA
class ModuleB {
@Dependency
lateinit var moduleA: ModuleA
}
fun main() {
val moduleA = ModuleA()
DependencyContainer.registerDependency(ModuleA::class.java, moduleA)
val moduleB = ModuleB()
injectDependencies(moduleB)
println(moduleB.moduleA)
}