关于“提供”方法或注入类的Dagger 2范围注释

时间:2016-07-15 08:58:33

标签: java scope annotations singleton dagger-2

我在Dagger 2示例中看到有些人在模块的配置方法上使用@Singleton,但也在提供的类上使用。{/ p>

@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
    return activityNavigator;
}

VS

@Singleton
public class ActivityNavigator extends Navigator {}

这两个展示位置有什么不同?应该使用它们还是其中一个就足够了?

2 个答案:

答案 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返回,也是一个单例。无论您在何处使用此组件,如果您需要ActivityNavigatorNavigator,都将使用此组件。

在您的情况下,这是多余的。如果您打算使用接口Navigator而不是实现,则不需要第二次创建相同的对象。保留它可能仍然是一个安全的选择,因为在应用程序的不同部分不使用相同的“单例”通常是一种可以通过这种方式避免的错误。

以下内容需要注释

@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}

无论是什么原因,现在你有一个对象可能提供2种不同的实现。如果要始终重用同一个对象,则必须确保只创建一次。如果您不提供构造函数注入的注释,则此对象将被创建两次。但是,既然如此,NavigatorSomeThingElse都将返回相同的对象。

@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
    return activityNavigator; // singleton ActivityNavigator!
}

@Provides
@Singleton
SomeThingElse providesSomethingElse(ActivityNavigator activityNavigator) {
    return activityNavigator; // the same ActivityNavigator!
}