我在使用dagger的简单项目中有3个类:
public class MyActivity extends Activity {
@Inject
public MyController controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.search);
super.onCreate(savedInstanceState);
objectGraph = ObjectGraph.create(new BootstrapModule(this));
objectGraph.inject(this);
System.out.println("MyActivity.controller: " + controller);
}
}
public class MyController {
@Inject
public EventDispatcher eventDispatcher;
public MyController()
{
System.out.println("MyController.eventDispatcher: " + eventDispatcher); // THIS IS NULL!
}
}
@Module(injects = {
MyActivity.class,
MyController.class
})
public class BootstrapModule {
private Context context;
public BootstrapModule(Context context){
this.context = context;
}
@Provides
@Singleton
public EventDispatcher provideEventDispatcher(){
return new EventDispatcher();
}
@Provides
@Singleton
public Context provideContext(){
return context;
}
}
现在我的问题是MyActivity控制器是在objectGraph.inject(this)方法调用之后由dagger创建的。 但是在MyController中没有创建eventDispatcher。我是否可以从Activity objectGraph.inject(控制器)再次调用dagger创建EventDispatcher?应该自动完成吗?
答案 0 :(得分:2)
字段注入在MyController的构造函数完成后完成。因此,在构造函数执行期间,尚未设置EventDispatcher实例。如果你在这行“objectGraph.inject(this);”之后断开你的代码在你的onCreate中,你会看到已经设置了EventDispatcher。
要解决此问题,您需要切换到构造函数注入。您可以通过将@Inject从EventDispatcher字段移动到MyController构造函数并将EventDispatcher添加为依赖项来完成此操作。
public class MyController {
public EventDispatcher eventDispatcher;
@Inject
public MyController(EventDispatcher eventDispatcher)
{
this.eventDispatcher = eventDispatcher;
System.out.println("MyController.eventDispatcher: " + eventDispatcher); // THIS WON'T BE NULL!
}
}
答案 1 :(得分:0)
注入永远不会自动发生,但遵循@Inject
给出的提示。你可以通过构造函数注入或手动注入,任何一种方式都有自己的优点和缺点。我个人更喜欢手动注射,因为它提供了更多的控制。