【问题标题】:Different @Singleton & static @Provides in dagger2匕首2中不同的@Singleton和静态@Provides
【发布时间】:2016-08-13 14:10:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: dagger-2


    【解决方案1】:

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

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

    要设置舞台,@Provides User 方法表示“对于此组件或其依赖项,每次需要用户时调用此 @Provides 方法”。通常,该方法每次都会返回一个新实例,而 Dagger 不会保存或缓存该实例。

    @Singletonscope 的一个示例,它是一种花哨的方式来表示 生命周期策略创建新实例的频率策略。 @Provides @Singleton User 表示“对于此组件或依赖项,只需调用此 @Provides 方法一次,并保存结果”。 @Singleton 恰好是一个内置的常见情况,但您也可以想象创建一个 @UserScope(始终为此用户返回相同的实例),或者在 Android 中创建一个 @FragmentScope@ActivityScope

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

    暂时不考虑作用域,static 的行为与您在 Java 中的预期完全一样:如果方法不需要任何实例状态,您可以将其设为 static,然后您的虚拟机可以调用它没有准备任何实例状态。在你生成的组件实现中,Dagger 会自动静态调用static 方法,以及你传入组件的模块实例上的实例方法;在 Android 中,这会带来相当大的性能提升。因为您没有在 currentUser 方法中使用任何实例状态,所以可以轻松地将其设置为 static

    进一步阅读:

    【讨论】:

    • 所以大多数时候,依赖方法应该标记为static对吗?因为它们很少有内部状态。
    • @hqt 是的,绑定很少是有状态的,所以@Provides 实现通常应该是static——尤其是在适当使用@BindsInstance 的情况下,例如绑定在模块中的状态.就此而言,如果您的静态 @Provides 方法只是 @Provides B provideB(A a) { return a; },请跳过 static 并直接使用 @Binds 以获得最佳性能。
    • 也许是一个菜鸟问题,但如何在 Kotlin 中应用它?
    • @Entreco 根本不是菜鸟问题!一个备受推崇的顶级问题,事实上:Dagger 2 static provider methods in kotlin
    【解决方案2】:

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

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

    【讨论】:

    • 我的回答也是针对dagger2的,你可以查看youtu.be/iwjXqRlEevg?t=5m9s更清楚
    • 如果我同时拥有 @Singleton 和 static 怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 2020-10-02
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多