关于应用程序组件的Dagger 2实例化

时间:2018-03-29 09:13:21

标签: java android dagger

我对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);
    }
}

2 个答案:

答案 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)方法将调用注入字段(在创建实例之后)。