不同的@Singleton&static @Provides在dagger2中

Sha*_*hye 20 dagger-2

我想知道之间的不同@Singleton VS 静态提供dagger2?

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

@Provides @Singleton User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ica 34

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

@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}
Run Code Online (Sandbox Code Playgroud)

要设置阶段,@Provides User方法说"对于此组件或其依赖项,每次需要用户时调用此@Provides方法".通常,该方法每次都会返回一个新实例,Dagger不会保存或缓存实例.

@Singleton范围的一个示例,这是一种说明生命周期策略策略的奇特方式,用于创建新实例的频率.@Provides @Singleton User说"对于这个组件或依赖项,只需调用一次@Provides方法,然后保存结果".@Singleton恰好是一个内置的常见情况,但你也可以想象创建一个@UserScope(总是为这个用户返回相同的实例),或者在Android a @FragmentScope@ActivityScope.

对于您的特定情况,您可能不希望@Singleton,因为它会指示您的组件保存缓存 AuthManager中的值.如果用户值可能会在应用程序的生命周期内发生变化,则组件不会反映这一点.(在这种情况下,您还需要确保注入Provider<User>,这将更新,而不是更新User.)

暂时搁置范围,static行为完全符合您在Java中的预期:如果方法不需要任何实例状态,您可以创建它static,并且您的虚拟机可以在不准备任何实例状态的情况下调用它.在生成的Component实现中,Dagger将自动static静态调用方法,并将Module实例上的实例方法传递给Component; 在Android中,这会带来相当大的性能提升.因为您不在方法中使用任何实例状态currentUser,所以可以轻松地进行static.

进一步阅读:

  • 所以大多数时候,依赖方法应该被标记为`static`吧?因为他们很少有内部状态. (2认同)
  • @Entreco根本不是一个菜鸟问题!事实上,一个备受推崇的顶级问题:[kotlin中的Dagger 2静态提供程序方法](/sf/ask/3142595291/) (2认同)