Android 匕首2不';我不能提供我的班级作为独生子女,为什么?
我有一门课:Android 匕首2不';我不能提供我的班级作为独生子女,为什么?,android,dagger-2,Android,Dagger 2,我有一门课: public class MyFactory { public MyFactory() { } } 我的匕首模块: @Module public class MyModule { @Provides @Singleton public MyFactory provideMyFactory() { return new MyFactory(); } } 我的组成部分: @Singleton @MyScope @Co
public class MyFactory {
public MyFactory() {
}
}
我的匕首模块:
@Module
public class MyModule {
@Provides
@Singleton
public MyFactory provideMyFactory() {
return new MyFactory();
}
}
我的组成部分:
@Singleton
@MyScope
@Component(modules = MyModule.class)
public interface MyComponent {
MyFactory getMyFactory();
}
我的工作范围:
@Scope
@Retention(RetentionPolicy.CLASS)
public @interface MyScope {
}
我希望Dagger2提供的MyFactory
实例是一个单例,但事实并非如此。我试图在项目的两个地方调用以下代码:
MyFactory factory = DaggerMyComponent.builder()
.build()
.getMyFactory();
Logcat.d("tag", "factory = " + factory);
我的日志显示:
factory = :com.my.app.MyFactory@eaa9330
factory = :com.my.app.MyFactory@8bd552e
如您所见,它们是两个实例。所以,我的问题是:
public class MyFactory {
@Inject
public MyFactory() {
}
}
问题1。在上述情况下,Dagger为什么不作为单身汉提供MyFactory
问题2。在我上面的代码中,每次调用DaggerMyComponent.builder().build()时代码>创建MyComponent的新实例
问题3。Dagger还允许通过在构造函数中放置@Inject
注释来注入开发人员的类实例,而无需费心让模块:
public class MyFactory {
@Inject
public MyFactory() {
}
}
开发者只需注入MyFactory即可使用它代码>
在这种情况下,如何使用Dagger 2制作MyFactory
singleton?范围是每个组件。如果创建多个组件,则创建多个对象@Singleton
也不例外
// same component
DaggerMyComponent firstComponent = DaggerMyComponent.builder().build();
firstComponent.getMyFactory() == firstComponent.getMyFactory(); // true
// second component
DaggerMyComponent secondComponent = DaggerMyComponent.builder().build();
firstComponent.getMyFactory() == secondComponent.getMyFactory(); // false
您必须保留组件实例并重用它们,否则将始终创建新引用。例如,一种常见的方法是将@Singleton AppComponent
放在应用程序中,并在需要时从那里获取它
在这种情况下,如何使用Dagger 2制作MyFactory singleton
使用构造函数注入,您只需将作用域添加到类的顶部
@Singleton // place scope _on_ the class
public class MyFactory {
@Inject
public MyFactory() {
}
}
你是说每次我调用DaggerMyComponent.builder().build()
它创建一个新的MyComponent
?如果是这样的话,有没有一种方法可以使组件单一化?我的问题3呢?@Leem.fin是的,它将始终重新创建包含所有内容的组件。没有“真正”的单身汉带着匕首。您应该在应用程序中保留单例范围的组件,并从中重用它。我建议不要将其存储在静态变量中。我更新了答案以反映问题,因为您每次都在创建一个新组件。