我已在范围内的组件上添加了@Singleton批注。它需要DbModule。我偷看了生成的类,发现DbModule函数有一些工厂(也标有@Singleton)。 Factory直接使用DbModule函数,因此每次调用get()工厂的方法时,它都会提供一个新实例,而该实例从不存储。然后,工厂将其另存为提供者。所以问题是匕首如何为相同范围提供相同实例?
然后将工厂存储为提供程序的组件。
这几乎是正确的,但不是完全正确。生成的组件代码如下所示:
this.provideDatabaseProvider = DoubleCheck.provider(DbModule_ProvideDatabaseFactory.create());
DoubleCheck.provider
方法返回一个委派给原始提供者的DoubleCheck
实例。这不是原始工厂,而是保存在组件中。
get
中的DoubleCheck
实现然后精确地调用一次委托Provider
并存储结果。随后每次对get
的调用都会返回之前存储的实例。