android Dagger2 多层注入

简单来说我们要实现的就是在MainActivity中注入一个Student对象,在Student对象中又注入一个Teacher对象

实现代码

二话不说,直接上代码

Student

public class Student {

    public String name;
    @Inject
    public Teacher teacher;

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

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

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

Teacher

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);
    }
}

MainActivityComponent

@Component
public interface MainActivityComponent {
    void inject(MainActivity activity);
}

MainActivity

public class MainActivity extends AppCompatActivity {

    @Inject
    Student student;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerMainActivityComponent.create().inject(this);
        TextView textView = findViewById(R.id.text);
        textView.setText(student.toString());
    }
}

运行结果

可以看到Student对象成功注入到了Activity中,而Student对象也成功注入到Student中

背后的原理

Dagger通过我们的注解自动生成了很多的代码,如下这些类都是Dagger帮我们生成的

里面的代码其实很简单,我就不一一黏贴上来了,自己可以建个工程跑一下就会生成这些文件,自己点进入看一下

我们主要看下注入的流程,从MainActivity中的注入开始看:

MainActivity的onCreate方法中开启注入

DaggerMainActivityComponent.create().inject(this);

 DaggerMainActivityComponent中的代码,直接看很清晰

injectMainActivity完成的动作是把Student对象注入到MainActivity,通过MainActivity_MembersInjector.injectStudent()方法来完成

injectStudent完成的动作是把Teacher对象注入到Student中,通过Student_MembersInjector.injectTeacher()方法来完成

@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 injectStudent(Student_Factory.newStudent());
}

@CanIgnoreReturnValue
private Student injectStudent(Student instance) {
  Student_MembersInjector.injectTeacher(instance, new Teacher());
  return instance;
}

最后看下以下两个Injector的注入实现,很简单,直接把注入对象赋值给被注入对象内的成员变量,大功告成

MainActivity_MembersInjector.injectStudent()方法:

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

Student_MembersInjector.injectTeacher()方法: 

public static void injectTeacher(Student instance, Teacher teacher) {
  instance.teacher = teacher;
}

 

 

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