我对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);
}
}
答案 0 :(得分:2)
在上面的例子中,Test将在类Main中由该类中的DaggerComponent实例实例化。
但是在Main2类中,除非在Test类型的属性上标记显式的@Inject注释,否则Test不会实例化。
另外,请注意,在上述情况下,如果在Main和Main2类中都需要类Test的单例实例,请使用相同的DaggerComponent实例在两个类中注入Test对象。由于您在两个类中分别实例化DaggerComponent,因此您将在Main和Main2中获得类Test的单独实例。
如果您想知道dagger如何在幕后使用示波器,请阅读Dagger生成的代码。我在介质上写了一篇关于匕首范围如何在内部工作的文章。如果你愿意,请按照这个。 How Dagger scopes work internally
答案 1 :(得分:1)
当它被注入某个类时会被实例化。
您可以使用dagger检查生成的代码,以查找inject(main2)
类的DaggerComponent
方法,它将为空,如下所示:
@Override
public void inject(main2 clazz) {}
inject(main)
方法将调用注入字段(在创建实例之后)。