我正在学习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());
}
一定要阅读一些教程,一定要尝试一下.如果你做错了,编译器会抱怨!