我在Dagger 2示例中看到有些人在模块的配置方法上使用@Singleton
,但也在提供的类上使用。{/ p>
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator;
}
VS
@Singleton
public class ActivityNavigator extends Navigator {}
这两个展示位置有什么不同?应该使用它们还是其中一个就足够了?
答案 0 :(得分:2)
在你的情况下,你应该使用这个:
@Singleton
public class ActivityNavigator extends Navigator {}
您需要提供非简单注射。例如,你不能注释一个接口,即使你可以如何匕首知道你想要哪个实现接口?
以下是官方网站的引用。
默认情况下,Dagger通过构造一个来满足每个依赖关系 如上所述的请求类型的实例。当你要求一个 CoffeeMaker,它将通过调用新的CoffeeMaker()和设置获得一个 它的可注射领域。
但@Inject并不适用于所有地方:
无法构建接口。
无法对第三方类进行注释。
必须配置可配置对象!
对于@Inject不足或笨拙的情况,请使用> @提供注解 满足依赖性的方法。方法的返回类型定义了哪个 依赖它满足。
答案 1 :(得分:2)
@Singleton
public class ActivityNavigator extends Navigator {}
将与构造函数注入一起使用,即dagger是否为您创建对象。
这就是说,如果你有上面的注释和使用构造函数注入,就像在下面...
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator;
}
Dagger将在组件中创建(并保留)ActivityNavigator
实例作为@Singleton
。然后它将为您提供此单例实例,并将其作为Navigator
返回,也是一个单例。无论您在何处使用此组件,如果您需要ActivityNavigator
或Navigator
,都将使用此组件。
在您的情况下,这是多余的。如果您打算使用接口Navigator
而不是实现,则不需要第二次创建相同的对象。保留它可能仍然是一个安全的选择,因为在应用程序的不同部分不使用相同的“单例”通常是一种可以通过这种方式避免的错误。
以下内容需要注释 :
@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}
无论是什么原因,现在你有一个对象可能提供2种不同的实现。如果要始终重用同一个对象,则必须确保只创建一次。如果您不提供构造函数注入的注释,则此对象将被创建两次。但是,既然如此,Navigator
和SomeThingElse
都将返回相同的对象。
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator; // singleton ActivityNavigator!
}
@Provides
@Singleton
SomeThingElse providesSomethingElse(ActivityNavigator activityNavigator) {
return activityNavigator; // the same ActivityNavigator!
}