匕首2中的不同@Singleton和静态@Provides

Different @Singleton & static @Provides in dagger2

我可以知道 @Singleton VS static 在 dagger2 中提供的区别吗?

@Provides static User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

@Provides @Singleton User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

使用 @Singleton 注释,在整个应用程序生命周期中只会创建一个用户对象实例。

static 最近引入的 @Provides 方法使方法调用速度提高 15% 到 20%,如前所述 here。如果我们多次调用这个方法,将会有多个 User 对象的实例。

这些是非常不同的属性,您可以独立拥有一个或另一个。所有这些都有效:

@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}

要搭建舞台,@Provides User 方法说 "for this Component or its dependencies, call this @Provides method every time you need a User"。通常,该方法每次都会 return 一个新实例,而 Dagger 不会保存或缓存该实例。

@Singletonscope 的一个例子,这是 lifecycle policy创建新实例的频率政策@Provides @Singleton User 说 "for this Component or dependencies, just call this @Provides method once, and save the result"。 @Singleton 恰好是 built-in 常见情况,但您也可以想象创建一个 @UserScope(始终 return 此用户的相同实例),或在 Android一个@FragmentScope@ActivityScope.

对于您的具体情况,您可能不需要 @Singleton,因为它会指示您的组件 savecache 来自 AuthManager 的值。如果 User 值可能会在应用程序的整个生命周期中发生变化,则 Component 不会反映出来。 (在那种情况下,您还需要确保注入 Provider<User>,它会更新,而不是 User,它不会。)

暂且不考虑作用域,static 的行为与您在 Java 中所期望的完全一样:如果一个方法不需要任何实例状态,您可以使它成为 static,你的虚拟机可以在不准备任何实例状态的情况下调用它。在您生成的组件实现中,Dagger 将自动静态调用 static 方法,并在您传递给组件的 Module 实例上调用实例方法;在 Android 中,这会带来相当大的性能提升。因为您在 currentUser 方法中不使用任何实例状态,所以可以很容易地制作 static.

延伸阅读: