android – 模块中的@Singleton和Dagger 2中的组件中的@Singleton之间的区别

前端之家收集整理的这篇文章主要介绍了android – 模块中的@Singleton和Dagger 2中的组件中的@Singleton之间的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

如果您还没有,请阅读User’s Guide获取有关匕首和示波器的一些基本知识.

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

我们有2个Component,一个使用范围@Singleton,另一个使用none:

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

    Object getObject();
}

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

    @Singleton
    Object getObject();

}

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

@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());
}

一定要阅读一些教程,一定要尝试一下.如果你做错了,编译器会抱怨!

猜你在找的Android相关文章