我想知道之间的不同@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.
进一步阅读:
| 归档时间: |
|
| 查看次数: |
4486 次 |
| 最近记录: |