Dagger 2和@Singleton的使用

时间:2018-01-09 07:37:39

标签: java dagger-2

我继承了一个使用Dagger 2的Java Web服务项目。基于我迄今为止对Dagger的有限理解,我很困惑为什么注入的每个类在dagger模块类中都有单例注释。如果我在没有匕首的情况下创建这个应用程序,他们就不会都是单身人士,这是匕首特有的东西还是以前的开发人员只是误用了Dagger?

2 个答案:

答案 0 :(得分:4)

  

[...]注入的每个类都有单例注释[...]这是匕首特有的东西吗?

不。默认情况下,@Singleton是Dagger中唯一包含的范围,但您也可以创建自定义范围,使用@Reusable可以创建多个对象,但如果可能,将重复使用它们,或者根本不使用范围。

  

还是以前的开发人员只是误用了Dagger?

如果可能的话,你应该问他们。如果每个对象都是一个Singleton,看起来他们没有在设置中投入大量精力,只是复制粘贴的声明,至少这是我的假设。

答案 1 :(得分:1)

the user guide中的Reusable部分开始:

  

有时您希望限制@Inject构造的次数   class被实例化或调用@Provides方法,但你没有   需要保证在期间使用完全相同的实例   任何特定组件或子组件的生命周期。这可以   在Android等环境中很有用,可以在其中进行分配   昂贵。

两个主要区别:

  1. @Singleton带注释的类可以保证始终提供相同的实例。如果我们保持全球状态,就需要它。 @Reusable不提供任何保证。
  2. 如果任何类请求@Singleton带注释的类的实例,则执行double checking(这很慢)。如果是@Reusable,则不是
  3. 我将@Reusable范围用于构建成本较高的类(例如我用于Retrofit实例 - 但说实话我从未做过性能测试是否值得使用此注释。

    另一方面,我使用@Singleton注释类作为缓存。

    另外,如果你的类保持封装的全局状态:

    class StateWrapper {
      final State state;
      @Inject
      StateWrapper(State state) {
        this.state = state;
      }
    }
    

    我的意思是状态事实上保存在State类中,不要将StateWrapper注释为@Singleton,始终注释最小的部分:在此case State类。 (此提示取自video