"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
,也是一个单例。无论您在哪里使用此组件,如果您需要 ActivityNavigator
或 Navigator
将被使用。
在您的情况下,这是多余的。如果您计划使用接口 Navigator
,而不是实现,则不需要或将要再次创建同一个对象。保留它可能仍然是一个安全的选择,因为在应用程序的不同部分不使用相同的 "singleton" 通常是一个可以通过这种方式避免的错误。
注解将用于如下内容:
@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}
不管是什么原因,现在您有一个对象可能提供 2 种不同的实现。如果你想一直重复使用同一个对象,你必须确保它只被创建一次。如果您不为构造函数注入提供注解,该对象将被创建两次。但是既然你这样做了,Navigator
和 SomeThingElse
都会 return 同一个对象。
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator; // singleton ActivityNavigator!
}
@Provides
@Singleton
SomeThingElse providesSomethingElse(ActivityNavigator activityNavigator) {
return activityNavigator; // the same ActivityNavigator!
}
我在 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
,也是一个单例。无论您在哪里使用此组件,如果您需要 ActivityNavigator
或 Navigator
将被使用。
在您的情况下,这是多余的。如果您计划使用接口 Navigator
,而不是实现,则不需要或将要再次创建同一个对象。保留它可能仍然是一个安全的选择,因为在应用程序的不同部分不使用相同的 "singleton" 通常是一个可以通过这种方式避免的错误。
注解将用于如下内容:
@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}
不管是什么原因,现在您有一个对象可能提供 2 种不同的实现。如果你想一直重复使用同一个对象,你必须确保它只被创建一次。如果您不为构造函数注入提供注解,该对象将被创建两次。但是既然你这样做了,Navigator
和 SomeThingElse
都会 return 同一个对象。
@Provides
@Singleton
Navigator providesNavigator(ActivityNavigator activityNavigator) {
return activityNavigator; // singleton ActivityNavigator!
}
@Provides
@Singleton
SomeThingElse providesSomethingElse(ActivityNavigator activityNavigator) {
return activityNavigator; // the same ActivityNavigator!
}