(二) Dagger2 @Inject分析二

代碼示例
class Food {
    // @Inject:該註解用於類構造方法上表示該類可以被Dagger2實例化對象後供注射器使用.
    @Inject
    public Food() {
    }
}
class Tiger {
    // 假如老虎需要食物
    Food food;
    // @Inject:該註解用於類構造方法上表示該類可以被Dagger2實例化對象後供注射器使用.
    @Inject
    public Tiger(Food food) {
        this.food = food;
    }
    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生成代碼閱讀

主要分析將具有依賴關係的不同對象加入到注射器中,注射器會根據對象使用者的需求來自動處理這些依賴關係.

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

  1. DaggerZooComponent.create()
    create()用來生成DaggerZooComponent對象,DaggerZooComponent的父類是ZooComponent接口,它重寫了接口中的inject()方法.
final class DaggerZooComponent implements ZooComponent {
    private DaggerZooComponent() {
    }
    // create()方法創建DaggerZooComponent對象
    public static ZooComponent create() {
        return new Builder().build();
    }
    static final class Builder {
        private Builder() {
        }
        // 創建DaggerZooComponent對象
        public ZooComponent build() {
          return new DaggerZooComponent();
        }
    }                       
}
  1. .inject(this)對象注入
    使用DaggerZooComponent對象將注射器創建的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) {
        // getTiger() 獲取Tiger對象
        // instance: 就是.inject(this)中的this Zoo對象.
        Zoo_MembersInjector.injectTiger(instance, getTiger());
        return instance;
    }
    // Tiger與Food構造都標註了@Inject註解,他們之間存在依賴關係,這種依賴關係最終由注射器處理.
    private Tiger getTiger() {
      return new Tiger(new Food());
    }
}
  1. Zoo_MembersInjector.injectTiger(instance, getTiger());
    最終的賦值動作就是由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.getTiger()創建的Tigerd對象.
      instance.tiger = (Tiger) tiger;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章