Dagger 1.x中的单身人士

Rag*_*eer 18 android dependency-injection dagger

当使用Dagger时,我发现当我在任何需要它的地方注入它时,我会得到一个单例的多个实例.我已经注释了类和提供方法@Singleton.谁能想到为什么会这样?

编辑:

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

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

Chr*_*ber 39

@Singleton在Dagger 1.x中,行为与你想象的不同.@Singletonjavadoc中的JSR-330规范定义是"每个图形一个",这就是Dagger如何解释它.

因此,如果您将某些内容标记为@Singleton,并且它在您的应用程序图形中实现(而不是更短生命周期的图形),那么每个应用程序都会获得一个实例.

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

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

(如果你没有标记它,@Singleton那么每个注射部位就会得到一个.)

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

注 - Dagger 2.x对此进行了改进,并支持自定义作用域注释,尽管机制类似,每个作用域注释使用一个图形(组件),在更宽/更短的生命周期的图形之间具有父/子关系