这些是非常不同的属性,你可以独立拥有一个或另一个。所有这些都是有效的:
@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值。如果用户值可能会在应用程序的整个生命周期中发生变化,则组件不会反映该值。 (在这种情况下,你也想确保注入Provider<User>
,这将更新,而不是User
它不会。)
离开作用域落后了片刻,static
行为正是你希望它在Java中的方法:如果某个方法不需要任何实例状态,则可以使其成为static
,并且虚拟机可以在不准备任何实例状态的情况下调用它。在您生成的Component实现中,Dagger将自动调用static
方法,并将模块实例中的实例方法自动传入您的组件;在Android中这会导致性能的显着提高。由于您在currentUser
方法中不使用任何实例状态,因此可以很容易地将其制作为static
。
延伸阅读:
那么大多数时候,依赖方法应该被标记为'static'吧?因为他们很少有内部状态。 – hqt
@hqt是的,绑定很少是有状态的,所以'@ Provide'实现通常应该是'static' - 特别是适当使用['@ BindsInstance'](https://google.github.io/dagger/api /latest/dagger/BindsInstance.html)的实例绑定,否则它们将在模块中声明。对于这个问题,如果你的静态'@Processor'方法只是'@Provides B provideB(A a){return a; }',跳过'static'并直接转到['@ Binds'](https://google.github.io/dagger/api/latest/dagger/Binds.html),以获得最佳性能。 –
也许是一个noob问题,但你怎么能在Kotlin中应用这个? – Entreco