gpt4 book ai didi

android - Dagger 2 中模块中的@Singleton 和组件中的@Singleton 的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:52:30 30 4
gpt4 key购买 nike

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

最佳答案

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

如果您还没有,请阅读 User's Guide了解有关 Dagger 和瞄准镜的一些基本知识。

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

我们有 2 个组件,一个使用作用域 @Singleton,另一个没有:

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

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

创建相同作用域的 2 个组件也会导致重复对象,可以这样证明:

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

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

一定要阅读一些教程,一定要尝试一下。如果你做错了,编译器提示! :)

关于android - Dagger 2 中模块中的@Singleton 和组件中的@Singleton 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37918233/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com