Android 匕首1.x中的单件

Android 匕首1.x中的单件,android,dependency-injection,dagger,Android,Dependency Injection,Dagger,当使用Dagger时,我发现当我在需要的地方注入它时,我会得到一个单例的多个实例。我已经用@Singleton注释了这个类和方法。谁能想到为什么会这样 编辑: 如果有帮助的话,我的应用程序的结构与Dagger的GitHub()中的示例应用程序相同。我正在尝试在基本活动中获取Singleton,并使用自定义应用程序中的@Provides获取两个第三方类。是因为我在每个活动中将模块添加到原始对象图中吗 (注:我对Dagger和DI基本上是新手,所以如果您能提供一个解释让我学习,我将不胜感激。谢谢。)

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

编辑:

如果有帮助的话,我的应用程序的结构与Dagger的GitHub()中的示例应用程序相同。我正在尝试在基本活动中获取Singleton,并使用自定义
应用程序中的
@Provides
获取两个第三方类。是因为我在每个活动中将模块添加到原始对象图中吗


(注:我对Dagger和DI基本上是新手,所以如果您能提供一个解释让我学习,我将不胜感激。谢谢。)

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

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

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

如果需要为每个应用程序创建一次,则需要确保将其创建为应用程序图的一部分。您可以通过以下两种方式之一实现此目的。可以使用应用程序模块中的@Providers方法显式提供它,也可以将其作为应用程序模块中@module(injects=…)中的类之一列出

(如果不使用
@Singleton
标记,则每个注射部位将获得一个。)

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


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

感谢您的澄清。当你说spec时,你指的是JSR330吗?@ChristianGruber这如何适用于父图的各种子图中使用的单例注入构造函数?这是否意味着该类在其中使用的每个图都有一个,除非它已经存在于父图中。如果一切都是“及时”的,那么是的,就是这样。如果您使用标记为Singleton的对象,它将在首先请求它的图形中创建。因此,如果您希望在父图(或根图)中创建它,您需要为Dagger提供一种方法,让它在长寿命图中了解它,方法是在
@Provides
方法中提供它,或者在长寿命图中模块注释的
injects=
属性中声明它。酷!我认为
@Provides
很笨拙,也不枯燥,我不知道
injects=
也可以使用它。@vinc3m1更枯燥的方法是将
@Singleton
放在项目的类定义上,而不是放在
@Prodices
块或
@Modules{injector=…}
作为类级
@Singleton
注释的规范将其限定为图形的单例。