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是的,它将始终重新创建包含所有内容的组件。没有“真正”的单身汉带着匕首。您应该在应用程序中保留单例范围的组件,并从中重用它。我建议不要将其存储在静态变量中。我更新了答案以反映问题,因为您每次都在创建一个新组件。