我有一个类A
和一个字段private SomeValue someValue
。我的Dagger @Component
类称为MyApplicationComponent
。
类A
在DaggerMyApplicationComponent
之前被实例化。因此,我不知道如何注入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
中?
答案 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);