"provides" 方法或注入的 class 上的 Dagger 2 作用域注解

Dagger 2 scope annotation on the "provides" method or on the injected class

我在 Dagger 2 示例中看到一些人在模块的供应方法上使用 @Singleton,但也在所提供的 class 上使用。

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

@Singleton
public class ActivityNavigator extends Navigator {}

这两个展示位置有什么区别?应该两者都用还是其中一个就够了?

在你的情况下你应该使用这个:

@Singleton
public class ActivityNavigator extends Navigator {}

您需要提供非简单注入。例如你不能注释一个接口,即使你可以,匕首应该如何知道你想要那个接口的实现?

引用官方网站

By default, Dagger satisfies each dependency by constructing an instance of the requested type as described above. When you request a CoffeeMaker, it'll obtain one by calling new CoffeeMaker() and setting its injectable fields.

But @Inject doesn't work everywhere:

Interfaces can't be constructed.

Third-party classes can't be annotated.

Configurable objects must be configured!

For these cases where @Inject is insufficient or awkward, use an > @Provides-annotated method to satisfy a dependency. The method's return type defines which dependency it satisfies.

@Singleton
public class ActivityNavigator extends Navigator {}

将与构造函数注入一起使用,也就是说,如果 dagger 为您创建对象。

这就是说,如果你有上面的注释 使用构造函数注入,如下所示...

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

Dagger 将在组件中创建(并保留)ActivityNavigator 实例作为 @Singleton。然后它将为您提供这个单例实例,您 return 它作为一个 Navigator,也是一个单例。无论您在哪里使用此组件,如果您需要 ActivityNavigatorNavigator 将被使用。

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


注解用于如下内容:

@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}

不管是什么原因,现在您有一个对象可能提供 2 种不同的实现。如果你想一直重复使用同一个对象,你必须确保它只被创建一次。如果您不为构造函数注入提供注解,该对象将被创建两次。但是既然你这样做了,NavigatorSomeThingElse 都会 return 同一个对象。

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

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