我在我的简单项目中使用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;
}
}现在我的问题是,在dagger上,控制器是在objectGraph.inject( MyActivity )方法调用之后由dagger创建的。但是在MyController中并没有创建eventDispatcher。我是否需要再次从Activity objectGraph.inject(控制器)调用dagger创建的EventDispatcher?它应该自动完成吗?
发布于 2014-04-12 01:31:24
字段注入是在来自MyController的构造函数完成之后完成的。因此,在构造函数执行期间,尚未设置EventDispatcher实例。如果在onCreate中将代码断点放在"objectGraph.inject( this );“这一行之后,就会看到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!
}
}发布于 2015-06-24 14:24:42
注入永远不会自动发生,而是遵循@Inject给出的提示。您可以通过构造函数进行注入,也可以手动进行注入,这两种方法各有优缺点。就我个人而言,我更喜欢手动注入,因为它提供了更多的控制。
通过构造函数注入
专业人士
声明此注入规则。
圆锥体
手动注入
专业人士
缺点
https://stackoverflow.com/questions/22978736
复制相似问题