AutoService 零反射DI框架

目录

一、框架定位

1、功能特性

[2、与其他 DI 框架对比](#2、与其他 DI 框架对比)

二、安装配置

[1. 添加仓库](#1. 添加仓库)

[2. 模块依赖](#2. 模块依赖)

三、五步快速集成

[1️⃣ 初始化框架](#1️⃣ 初始化框架)

[2️⃣ 定义服务接口](#2️⃣ 定义服务接口)

[3️⃣ 标注实现类](#3️⃣ 标注实现类)

[4️⃣ 注入依赖](#4️⃣ 注入依赖)

[5️⃣ 手动获取服务](#5️⃣ 手动获取服务)

四、框架特别说明

[1、@Service 属性说明](#1、@Service 属性说明)

[2、@Inject 属性说明](#2、@Inject 属性说明)

3、编译期优化机制

4、编译期优化说明


一、框架定位

一个轻量级 Android DI(依赖注入)框架,基于注解处理器(APT)在编译期自动生成服务注册与注入代码,零反射、零运行时开销。

  1. 框架定位和原理(编译期 APT、零反射)
  2. 从 JitPack 安装(Gradle 配置、Java/Kotlin 区别)
  3. 5 步上手流程(定义接口 → 标注 @Service → 初始化 → @Inject 注入 → 手动获取)

1、功能特性

  • 编译期代码生成 :基于 @Service 注解,编译时自动生成服务注册表,无运行时反射
  • 接口驱动:自动识别实现类所实现的接口,以接口名称作为服务标识
  • 字段注入 :通过 @Inject 注解自动注入依赖
  • 服务查找:支持按名称手动获取服务实例
  • 线程安全:初始化过程异步执行,注入时自动等待就绪
  • 调试日志:内置日志开关,方便排查问题

2、与其他 DI 框架对比

特性 AutoService Dagger/Hilt Koin
工作原理 编译期生成 编译期生成 运行时反射
启动性能影响 ✅ 零影响 ⚠️ 轻微 ❌ 显著
Kotlin 兼容性 ✅ 100% ✅ 100% ✅ 100%
多模块支持
学习曲线 ⭐️⭐️ ⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️

二、安装配置

1. 添加仓库

根据 Gradle 版本选择配置方式:

Android Gradle Plugin < 7.1.0

根目录 build.gradle

Groovy 复制代码
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
        mavenCentral()
        google()
    }
}

Android Gradle Plugin ≥ 7.1.0

settings.gradle

Groovy 复制代码
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url 'https://jitpack.io' }
        mavenCentral()
        google()
    }
}
2. 模块依赖

最新可用的版本:

Groovy 复制代码
dependencies {
    implementation 'com.gitee.ym521.autoservice:di-api:latest-version'
    // Java项目
    annotationProcessor 'com.gitee.ym521.autoservice:di-compiler:latest-version'
    // Kotlin项目
    kapt 'com.gitee.ym521.autoservice:di-compiler:latest-version'
}

三、五步快速集成

1️⃣ 初始化框架
Kotlin 复制代码
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AutoService.init(this).debug(true) // 可选调试日志
    }
}
2️⃣ 定义服务接口
Kotlin 复制代码
interface PaymentService {
    fun process(amount: Double)
}
3️⃣ 标注实现类
Kotlin 复制代码
@Service // 默认单例模式
class AlipayServiceImpl : PaymentService {
    override fun process(amount: Double) {
        // 支付宝支付逻辑
    }
}

// 自定义服务名+非单例
@Service(name = "WeChatPay", singleton = false)
class WeChatPayImpl : PaymentService {...}
4️⃣ 注入依赖
Kotlin 复制代码
abstract class BaseActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AutoService.inject(this)  // 自动注入所有 @Inject 字段
    }
}


class CheckoutActivity : BaseActivity() {
    @Inject // 按接口类型注入
    lateinit var defaultPayment: PaymentService

    @Inject(name = "WeChatPay") // 按名称注入
    lateinit var wechatPayment: PaymentService
}
5️⃣ 手动获取服务
Kotlin 复制代码
val paymentService = AutoService.get(PaymentService::class.java)
val customService = AutoService.get("WeChatPay", PaymentService::class.java)

四、框架特别说明

1、@Service 属性说明

属性 类型 默认值 说明
name String "" 自定义服务名称,为空时自动使用接口简单名
singleton boolean true true=单例,false=非单例(每次获取创建新实例)

注意 :Kotlin object 类即使标记为 @Service(singleton = false),也会按单例处理------这是 Kotlin 语言特性决定的,无法创建额外实例。

2、@Inject 属性说明

属性 类型 默认值 说明
name String "" 自定义服务名称,为空时自动使用字段类型或方法参数类型的简单名

3、编译期优化机制

注解处理器 生成代码 优化效果
ServiceProcessor ServiceRegistry_xxx 编译期确定实现类,避免运行时扫描
InjectProcessor InjectHelper_* 注入操作零反射调用

4、编译期优化说明

AutoService 在编译期做了两件事来消除运行时反射:

阶段 处理器 生成产物 效果
@Service ServiceProcessor ServiceRegistry_xxx 编译期确定服务实现类,避免运行时扫描
@Inject InjectProcessor InjectRegistry_xxx + InjectHelper_* 编译期预生成 InjectMeta,inject() 时零反射扫描

即使依赖的第三方库未使用本框架,运行时也会优雅降级为反射扫描,不影响功能。


通过编译期代码生成和明确的服务注册机制,该框架既保持了依赖注入的灵活性,又规避了运行时反射的性能陷阱。其清晰的接口驱动设计和线程安全的初始化流程,使得组件间解耦更加优雅高效。