Java Dagger中的对象图和单例

Java Dagger中的对象图和单例,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我刚从dagger开始,遇到了一些关于单例对象的问题 所以单身汉看起来像这样:- @Module( injects = {MainActivity.class,SecondActivity.class} ) public class MySingle { //just to count the number of instances of the class public static int thecount=0; //the constructor public

我刚从dagger开始,遇到了一些关于单例对象的问题

所以单身汉看起来像这样:-

@Module(
    injects = {MainActivity.class,SecondActivity.class}
)
public class MySingle {
   //just to count the number of instances of the class
   public static int thecount=0;
  //the constructor
   public MySingle(){
      Log.v("testing","created");
      thecount++;
    }

@Singleton
@Provides
public MySingle getSingle(){
        return new MySingle();
}
}
创建对象图的应用程序类:-

public class MyApplication extends Application {
private ObjectGraph objectGraph;
@Override
public void onCreate(){
    super.onCreate();
    objectGraph=ObjectGraph.create(new MySingle());

}
public ObjectGraph getObjectGraph(){
    return objectGraph;
}

}
MainActivity.class:-

public class MainActivity extends ActionBarActivity {
@Inject MySingle mysingle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 //   MyApplication app=(MyApplication)getApplication();
  // app.getObjectGraph().inject(this);
    Log.v("testing", mysingle.thecount + " mainact");
}
 }
所以每当我运行它时,单例“MySingle”的实例数是1,这很好。但是,当我取消注释这些行时:-

MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);

我得到的实例数为2。据我所知,Dagger为每个对象图创建了一个单例,但根据我使用上述两行所了解的情况,我将MainActivity.class注入到现有的对象图中,显然到目前为止我还不清楚它的用法。。我只是在试验它。

MySingle不应该是@Module本身。您正在使用new MySingle()自己创建模块,然后从ObjectGraph获取一个MySingle实例,就像@Providers方法所说的,它也在调用new MyModule

但根据我使用上述两行所了解的情况,我正在将MainActivity.class注入现有的对象图中

否。您正在将依赖项注入MainActivity。您的模块同时是dagger模块和依赖项:)第一次在Application onCreate方法中创建MySingle,第二次在注入过程中创建MySingle

@Module注释应该位于提供依赖项的类上,您应该在那里提供依赖项。例如:

@Module(
    injects = {MainActivity.class,SecondActivity.class}
)
public class DependencyModule {

    @Singleton
    @Provides
    public Repository getSingle(){
        return new InMemoryRepository();
    }
}
一些接口:

public interface Repository {
    List<String> getAllStrings();
}

您可以有几个存储库的实现:在数据库中、内存中、文件中,并且您只能创建其实现,并通过模块将其绑定到存储库接口,而无需接触活动代码!使用dagger,您可以注入任何类,而不仅仅是活动

,与提供的答案类似。你为什么要让你的模块成为单身汉?我想不出为什么我会在我的任何应用程序中这样做。你能解释一下你想要完成什么吗?我除了试图理解dagger和依赖注入之外,什么都不想完成。我有点理解Ben的回答,但没有完全理解这个概念。。期待更详细的解释谢谢@Gaskoin。。这就是我想知道的!
public class InMemoryRepository implements Repository {
    @Override
    List<String> getAllStrings() {
        // you can create this list as static list in constructor if you are not sure that it is really singleton :)
        List<String> list = new ArrayList<String>();
        list.add("Hello");
        list.add("World");
        return list;
    }
}
public class MainActivity extends ActionBarActivity {
    @Inject Repository myRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyApplication app=(MyApplication)getApplication();
        app.getObjectGraph().inject(this);
        Log.v("testing", repository.getAllString().get(0));
    }
}