承接上一篇《依赖注入入门:构造注入与字段注入》,那一篇讲清了「为什么要 DI」,这一篇讲「Hilt 具体怎么做」。Hilt 不是凭空出现的——它是 Dagger 针对 Android 生命周期做的重新设计,理解它必须先理解 Dagger 原本的问题。
结论先行:Hilt 相对 Dagger 的核心改进是「用 Android 的组件树替代了自定义的作用域链」,让作用域与生命周期有了天然对应关系。 这带来的结果是:几乎不需要写自定义 Scope,@Singleton / @ActivityScoped 就能覆盖绝大多数场景。
一、Dagger 原本的问题
Dagger 2 在纯 Java/Kotlin 项目里很好用,但在 Android 上有三个不适配:
问题一:作用域靠自定义注解声明,与生命周期脱钩。
// Dagger 原生写法:自定义作用域
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}
@PerActivity
@Module
public class ActivityModule {
@Provides @PerActivity
ActivityCache provideCache() { return new ActivityCache(); }
}
问题:



