Android Dagger2 构造方法参数注入

在上一篇文章Dagger2最简单的入门我们写了一个最简单的demo来介绍Dagger2,我们通过@Inject注解构无参造器来注入对象

那么如果构造器有参数,且这个参数也需要注入,又该怎么写呢?

本篇基于上一篇文章Dagger2最简单的入门,代码片段也是以上一篇文章的demo修改的,所以看本篇之前先看上一篇

 

我们先增加一个Teacher类,其中的无参构造方法用@Inject标识

public class Teacher {

    public String name;

    @Inject
    public Teacher() {
        this.name = "苍老湿";
    }

    public Teacher(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("我的名字叫%s啦", name);
    }
}

然后修改Student类原来的无参构造方法,增加一个Teacher参数,在toString()中增加显示老师的信息

public class Student {

    public String name;
    public Teacher teacher;

    @Inject
    public Student(Teacher teacher) {
        this.name = "野猿新一";
        this.teacher = teacher;
    }

    public Student(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("我的名字叫%s啦,我们老师的名字叫%s", name, teacher.name);
    }
}

ok,大工告成,就上面两步,直接运行看看

可以看到,注入Student对象的同时,也成功注入了Teacher对象

我们还是看下Dagger生成代码的注入流程

在MainActivity中调用如下代码

DaggerMainActivityComponent.create().inject(this);

 DaggerMainActivityComponent中innect()方法再调用injectMainActivity()方法

injectMainActivity()方法内部调用了MainActivity_MembersInjector.injectStudent(),传入了activity对象和通过getStudent()方法获取的Student对象

我们看到getStudent()方法中直接new了一个Teacher对象,然后作为参数再new一个Student

@Override
public void inject(MainActivity activity) {
  injectMainActivity(activity);
}

@CanIgnoreReturnValue
private MainActivity injectMainActivity(MainActivity instance) {
  MainActivity_MembersInjector.injectStudent(instance, getStudent());
  return instance;
}

private Student getStudent() {
  return new Student(new Teacher());
}

最后看下MainActivity_MembersInjector的injectStudent()方法,直接将传入student赋值给activity的student成员变量,至此就成功把Student注入到MainActivity中

public static void injectStudent(MainActivity instance, Student student) {
  instance.student = student;
}

 

 

 

 

posted @ 2019-06-15 09:54  野猿新一  阅读(48)  评论(0编辑  收藏  举报