(一) Dagger2 @Inject分析一

代码示例
// 对象提供方
class Tiger {
    // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用.
    @Inject  
    public Tiger() {
    }
    public void sleep() {
        System.out.println("Tiger sleeping");
    }
}
// 对象使用者
public class Zoo {
    // @Inject: 该注解用于成员变量上代表注射器可以为该成员变量赋值对象.
    @Inject
    Tiger tiger;

    @Test
    public void 案例一() {
        DaggerZooComponent.create().inject(this);
        tiger.sleep();
    }
}
// 注射器
// @Component: 该注解是用来创造对象提供方和对象使用间的桥梁,如何将对象赋值给成员变量都是由它来做的.
@Component
interface ZooComponent {
    Zoo inject(Zoo zoo);
}
Dagger2生成代码阅读

主要说的是@Inject注解提供对象给注射器使用.

就着上面的案例来看下Degger2生成的代码,生成的代码在build\generated\sources\annotationProcessor\..文件夹中.

  1. DaggerZooComponent.create()
    create()用来生成DaggerZooComponent对象,DaggerZooComponent的父类是ZooComponent接口,它重写了接口中的inject()方法.
final class DaggerZooComponent implements ZooComponent {
    // create()方法创建DaggerZooComponent()对象
    public static ZooComponent create() {
      return new Builder().build();
    }
    static final class Builder {
      private Builder() {
      }
      public ZooComponent build() {
        // build()方法返回DaggerZooComponent对象.
        return new DaggerZooComponent();
      }
    }
}
  1. .inject(this)对象注入
    使用DaggerZooComponent对象将Dagger2创建的Tiger对象注入到Zoo中.
final class DaggerZooComponent implements ZooComponent {
    // 接口中的方法,由DaggerZooComponent实现,该方法就是用来向Zoo对象中注入Tiger对象的.
    @Override
    public Zoo inject(Zoo zoo) {
      // zoo就是inject(this)中的this了,代表Zoo对象.
      return injectZoo(zoo);
    }
    private Zoo injectZoo(Zoo instance) {
      // 接着调用了 Zoo_MembersInjector.injectTiger(instance, new Tiger());
      // new Tiger(): 这个对象就是由Dagger2创建的Tiger对象.
      // instance: 代表Zoo对象.
      Zoo_MembersInjector.injectTiger(instance, new Tiger());
      return instance;
    }
}
  1. Zoo_MembersInjector.injectTiger(instance, new Tiger())
    最终的赋值动作就是由injectTiger()方法做的.
public final class Zoo_MembersInjector implements MembersInjector<Zoo> {
    @InjectedFieldSignature("com.yey.dagger2.Zoo.tiger")
    public static void injectTiger(Zoo instance, Object tiger) {
      // instance.tiger: 为Zoo中字段tiger
      // tiger: 为上一步方法DaggerZooComponent.injectZoo()创建的Tigerd对象.
      instance.tiger = (Tiger) tiger;
    }
}

通过一个非常简单的案例来熟悉Dagger2到底为各个对象做了些什么,下面会将案例复杂化.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章