19

使用 Dagger 时,我发现当我在需要的地方注入它时,我会得到多个单例实例。我已经用@Singleton. 谁能想到为什么会这样?

编辑:

如果有帮助,我的应用程序的结构与 Dagger 的 GitHub ( https://github.com/square/dagger/tree/master/examples/android-activity-graphs ) 中的示例应用程序相同。@Provides我正在尝试在基本活动中获取 Singleton 以及在自定义类中使用的几个第三方Application类。是因为我在每个活动中都将模块添加到原始对象图吗?

(PS:我是Dagger和DI的新手,所以如果你能提供解释以便我学习,我将不胜感激。谢谢。)

4

1 回答 1

39

@Singleton,在 Dagger 1.x 中,行为与您想象的不同。javadoc中的 JSR-330 规范定义@Singleton是“每个图一个”,这就是 Dagger 解释它的方式。

因此,如果您有标记为 的@Singleton内容,并且它在您的应用程序图中具体化(与较短生命周期的图相反),那么每个应用程序都会获得一个实例。

如果您@Singleton在用于配置活动图的模块中注释了一个项目(即,从 plus() 操作中使用的模块指定的图表部分获得),那么您将获得一个每个活动-图形。

如果您需要每个应用程序一次,您需要确保它被创建为应用程序图的一部分。您可以通过以下两种方式之一执行此操作。要么显式地为它提供来自应用程序模块的@Provides 方法,要么可以将其列为应用程序模块中@Module(injects=...) 中的类之一。

(如果您没有标记它,@Singleton那么您将在每个注射部位获得一个。)

所以请记住,由 plus() 创建的图被视为一个单独的图,它指向生成它的图并包装它,可以访问其中的实例,但不是同一个图。

注意 - Dagger 2.x 改进了这一点,并支持自定义范围注释,尽管机制相似,每个范围注释一个图(组件),在更宽/更窄生命周期的图之间具有父/子关系

于 2013-07-03T16:11:25.903 回答