Java 应用程序组件上的Dagger 2实例化

Java 应用程序组件上的Dagger 2实例化,java,android,dagger,Java,Android,Dagger,我有个关于dagger2的问题 如果我为ApplicationComponent提供了@Singleton,但没有在某个类中使用@Inject实例化对象。当对象在某个类中被@Inject时,它是被实例化还是将被实例化? 例如,在下面的代码中,测试是否在main2上实例化 @Singleton public class Test { @Inject public Test() { } } public class main() { @Inject Test t

我有个关于dagger2的问题

如果我为ApplicationComponent提供了
@Singleton
,但没有在某个类中使用
@Inject
实例化对象。当对象在某个类中被
@Inject
时,它是被实例化还是将被实例化? 例如,在下面的代码中,测试是否在main2上实例化

@Singleton
public class Test {
    @Inject
    public Test() {
    }
}


public class main() {

    @Inject Test test;

    public void start() {
        DaggerComponent.create().inject(this);
    }
}

public class main2() {
    public void start() {
        DaggerComponent.create().inject(this);
    }
}

当它被注入到某个类中时,它将被实例化

您可以检查dagger为
DaggerComponent
类的
inject(main2)
方法生成的代码,它将是空的,如下所示:

   @Override
     public void inject(main2 clazz) {}

inject(main)
方法将调用注入字段(在创建字段实例之后)。

在上述情况下,测试将由该类中DaggerComponent的实例在类main中实例化

但在类Main2中,除非在类型Test的属性上标记了显式@Inject注释,否则不会实例化Test

另外,请注意,在上述情况下,如果在类Main和Main2中都需要类Test的单例实例,请使用相同的DaggerComponent实例在这两个类中注入测试对象。当您在两个类中分别实例化DaggerComponent时,您将在Main和Main2中获得单独的类测试实例

如果您想知道dagger如何在幕后使用作用域,请阅读dagger生成的代码。我在媒体上写了一篇关于匕首示波器内部工作原理的文章。如果你想的话,遵循这个

你必须