首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger自动注射

Dagger自动注射
EN

Stack Overflow用户
提问于 2014-04-10 12:35:11
回答 2查看 950关注 0票数 0

我在我的简单项目中使用dagger有3个类:

代码语言:javascript
复制
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?它应该自动完成吗?

EN

回答 2

Stack Overflow用户

发布于 2014-04-12 01:31:24

字段注入是在来自MyController的构造函数完成之后完成的。因此,在构造函数执行期间,尚未设置EventDispatcher实例。如果在onCreate中将代码断点放在"objectGraph.inject( this );“这一行之后,就会看到EventDispatcher已经设置好了。

为了解决这个问题,你需要切换到构造器注入。您可以通过将@Inject从EventDispatcher字段移动到MyController构造函数并将EventDispatcher作为依赖项添加来完成此操作,如下所示。

代码语言:javascript
复制
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!
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-24 14:24:42

注入永远不会自动发生,而是遵循@Inject给出的提示。您可以通过构造函数进行注入,也可以手动进行注入,这两种方法各有优缺点。就我个人而言,我更喜欢手动注入,因为它提供了更多的控制。

通过构造函数注入

专业人士

  • 依赖项将自动解析,甚至在层次结构的深层也会自动解析。
  • 不需要通过component

声明此注入规则。

圆锥体

  • 您无法控制注入发生的时间

手动注入

专业人士

  • 控制生命周期,并且可以使用不同的组件多次注入

缺点

  • 需要编写额外的代码才能实现
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22978736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档