在Dagger组件之前实例化的类的注入字段

时间:2018-08-25 15:14:52

标签: android dagger-2

我有一个类A和一个字段private SomeValue someValue。我的Dagger @Component类称为MyApplicationComponent

ADaggerMyApplicationComponent之前被实例化。因此,我不知道如何注入someValue

我不能使用构造函数注入,因为A是在组件之前创建的。

我相信我也不能使用字段注入,因为在A中我需要调用MyApplicationComponent.inject(this),但是在A中我不知道MyApplicationComponent何时会实例化,所以我不知道何时致电.inject

我通过将此方法添加到A来尝试使用setter注入:

@Inject
public void setSomeValue(SomeValue someValue) {
    log.info("in setter injector!");
    this.someValue = someValue;
}

我也将其添加到MyApplicationComponent

void inject(A a);

但是,永远不会调用setter方法。

为什么不调用此方法?

Dagger如何进行二传手注射?

一旦someValue实例化后,是否有某种方法告诉Dagger将A注入DaggerMyApplicationComponent中?

1 个答案:

答案 0 :(得分:0)

使用方法注入,实例化对象时,dagger会调用一次使用@inject注释进行注释的方法。这意味着它不是您所需要的。您可以定义一个通用接口,您的组件接口(MyApplicationComponent)对其进行扩展。

interface Injector<T> {
    void inject(T instance);
}


public interface MyApplicationComponent extends Injector<A>{

    MyApplicationComponent getMyApplicationComponent();

    void inject(A instance);
}

然后在您的类中创建一个方法,如下所示:

public class A {


    private SomeValue someValue

    public void setSomeValue(Injector<A> com) {
       com.inject(this);
    }
}

最后,在创建ur组件时,调用setSomeValue方法并将组件对象传递给它。

A obj=new A();

MyApplicationComponent component=DaggerMyApplicationComponent.create();

obj.setSomeValue(component);