gpt4 book ai didi

dagger-2 - Dagger 2中不同的@Singleton和静态@Provides

转载 作者:行者123 更新时间:2023-12-03 12:08:08 28 4
gpt4 key购买 nike

我可以知道之间的区别吗? @Singleton VS 静态 在dagger2中提供?

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

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

最佳答案

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

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

为了设置舞台, @Provides User方法说“对于此组件或其依赖项,每次需要用户时调用此 @Provides 方法”。通常,该方法每次都会返回一个新实例,而 Dagger 不会保存或缓存该实例。
@Singleton是一个范围的例子,这是一种花哨的方式来表示生命周期策略或创建新实例的频率策略。 @Provides @Singleton User说“对于此组件或依赖项,只需调用此 @Provides 方法一次,并保存结果”。 @Singleton恰好是一个内置的常见情况,但您也可以想象创建一个 @UserScope (始终为该用户返回相同的实例),或者在 Android 中为 @FragmentScope@ActivityScope .

对于您的具体情况,您可能不想要 @Singleton ,因为它会指示您的组件保存或缓存来自 AuthManager 的值。如果 User 值可能在您的应用程序的生命周期内发生变化,则 Component 不会反射(reflect)这一点。 (在这种情况下,您还需要确保注入(inject) Provider<User> ,它会更新,而不是 User 不会更新。)

暂时离开瞄准镜, static行为与您在 Java 中所期望的完全一样:如果方法不需要任何实例状态,则可以将其设为 static ,并且您的虚拟机可以在不准备任何实例状态的情况下调用它。在你生成的组件实现中,Dagger 会自动调用 static静态方法,以及传递给组件的 Module 实例上的实例方法;在 Android 中,这会带来相当大的性能提升。因为您没有在 currentUser 中使用任何实例状态。方法,可以轻松制作 static .

进一步阅读:
  • 所以:Scopes in Dagger 2
  • Dagger 文档:Component (见标题“范围”)
  • 关于dagger-2 - Dagger 2中不同的@Singleton和静态@Provides,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933560/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com