模块中的@Singleton与Dagger 2中的组件中的@Singleton之间的差异

时间:2016-06-20 08:52:19

标签: android dagger-2

我正在学习Dagger 2,我注意到在某些示例中,模块的方法中有@Singleton,而Component的方法上有其他@Singleton?有什么区别,模块方法和组件方法的@Singleton注释究竟是什么意思?

1 个答案:

答案 0 :(得分:3)

由于您是初学者,我强烈建议您尝试一下。编写单元测试很容易,它有助于理解和证明理论。

如果您还没有,请阅读User's Guide,了解有关匕首和范围的一些基本知识。

在组件(提供方法)中注释方法并没有任何效果。您必须在模块中注释类或提供方法。我想快速展示你如何能够自己快速证明这一点:

我们有2个组件,一个使用范围@Singleton,另一个使用无:

@Singleton
@Component(modules = SingletonModule.class)
public interface SingletonComponent {

    Object getObject();
}

@Component(modules = NormalModule.class)
public interface NormalComponent {

    @Singleton
    Object getObject();

}

这些组件有两个模块,一个提供单例作用域对象(与组件相同),另一个只使用范围:

@Module
public class SingletonModule {

    @Provides
    @Singleton
    public Object provideObject() {
        return new Object();
    }
}

@Module
public class NormalModule {

    @Provides
    public Object provideObject() {
        return new Object();
    }
}

现在我们只是创建一个小测试:

public class ComponentTest {

    @Test
    public void testSingletonComponent() {
        SingletonComponent component = DaggerSingletonComponent.create();

        Assert.assertEquals(component.getObject(), component.getObject());
    }


    @Test
    public void testNormalComponent() {
        NormalComponent component = DaggerNormalComponent.create();

        Assert.assertNotSame(component.getObject(), component.getObject());
    }
}

此测试将成功并证明组件中的注释方法无法执行任何操作。在使用构造函数注入时,在模块中对对象进行范围限定或对类本身进行注释将导致对象在同一范围内/同一组件中重用

创建相同作用域的2个组件也会导致重复的对象,如下所示:

@Test
public void testTwoSingleonComponents() {
    SingletonComponent component1 = DaggerSingletonComponent.create();
    SingletonComponent component2 = DaggerSingletonComponent.create();

    Assert.assertNotSame(component1.getObject(), component2.getObject());
}

请务必阅读一些教程,并确保尝试一下。如果你做错了,编译器抱怨! :)