java - "provides"方法或注入(inject)类上的 Dagger 2 范围注释

标签 java scope annotations singleton dagger-2

我在 Dagger 2 示例中看到一些人在模块的供应方法和提供的类上使用 @Singleton

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

对比

@Singleton
public class ActivityNavigator extends Navigator {}

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

最佳答案

@Singleton
public class ActivityNavigator extends Navigator {}

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

这就是说,如果你有上面的注解使用构造函数注入(inject),就像下面...

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

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

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


注释如下所示:

@Singleton
public class ActivityNavigator extends Navigator implements SomeThingElse {}

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

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

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

关于java - "provides"方法或注入(inject)类上的 Dagger 2 范围注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392014/

相关文章:

java - 让 Netbeans 平台注释在 Eclipse 中工作

ios - 带有中文文本注释的Mupdf

java - Morphia 中的 @Embedded 注释实际上有什么作用?

java - 引用 war 内的文件

c - 关于 C 中变量的范围

java - JEdi​​torPane - 制作制表符空间

php - 正确理解 PHP 中的作用域(与 Javascript 相比)

javascript - CommonJS 函数声明范围的良好实践

java - Java 队列的多线程处理

java - 使用JAVA Spring同步rest服务