当使用Dagger时,我发现当我将它注入任何需要的地方时,我会得到一个单例的多个实例。我用@Singleton
注释了类和提供方法。谁能想到为什么会这样?
编辑:
如果有帮助,我在Dagger的GitHub(https://github.com/square/dagger/tree/master/examples/android-activity-graphs)中使用了与我的应用程序相同的结构作为示例应用程序。我正在尝试在基本活动中使用Singleton,并在自定义@Provides
类中使用Application
提供了几个第三方类。是因为我在每个活动中将模块加到原始对象图上吗?
(PS:我一般是Dagger和DI的新手,所以如果你能提供解释以便我学习,我将不胜感激。谢谢。)
答案 0 :(得分:39)
@Singleton
的行为与你想象的不同。 @Singleton
javadoc中的JSR-330规范定义是“每个图形一个”,这就是Dagger如何解释它。
因此,如果您有一些标记为@Singleton
的内容,并且它已在您的应用程序图形中实现(而不是更短生命周期的图形),那么每个应用程序都会获得一个实例。
如果您有一个注释@Singleton
的项目,您在用于配置活动图表的模块中(即,从plus()操作中使用的模块指定的图形部分获得)你将得到一个每活动图表。
如果您需要每个应用程序执行一次,则需要确保将其作为应用程序图的一部分创建。您可以通过以下两种方式之一完成此操作。要么从应用程序模块中明确地提供@Provides方法,要么可以将其列为应用程序模块中@Module(injects = ...)中的一个类。
(如果你没有用@Singleton
标记它,那么每个注射部位就会得到一个。)
所以请记住,plus()创建的图形被视为一个单独的图形,指向生成它的图形,并包装它,可以访问其中的实例,但不是相同的图形。
注意 - Dagger 2.x对此进行了改进,并支持自定义作用域注释,但机制类似,每个作用域注释使用一个图形(组件),在更宽/更短生命周期的图形之间具有父/子关系