Dagger2 基礎 (一)

最簡單的應用

  1. 配置環境在根gradle中
dependencies {
     ... 
     // 其他classpath
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令
 }
在App.gradle中

dependencies {
  compile 'com.google.dagger:dagger:2.x'
  apt 'com.google.dagger:dagger-compiler:2.x'
  provided 'javax.annotation:jsr250-api:1.0'
}
 2.使用@Inject注入
public class RestApiStore {
  public String s;

  @Inject
  public RestApiStore (){
    s = "12";
  }
}
//activity中
@Inject RestApiStore apiStore;
3.使用module注入
//Module類
@Module
public class MainActivityModule {

  @Provides
  RestApiStore provideApiStore(){
    return new RestApiStore();
  }
}

//component類
@Component(MainActivityModule.class)
public interface MainActivityComponent {
  void inject(MainActivity mainActivity);
}

//activity中
@Inject RestApiStore apiStore;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerMainActivityComponent.builder().build().inject(this);
  }

以上是兩種最基本的Dagger2用法。

總結

Inject,Component,Module,Provides是dagger2中的最基礎最核心的知識點。奠定了dagger2的整個依賴注入框架。
Inject主要是用來標註目標類的依賴和依賴的構造函數
Component它是一個橋樑,一端是目標類,另一端是目標類所依賴類的實例,它也是注入器(Injector)負責把目標類所依賴類的實例注入到目標類中,同時它也管理Module。
Module和Provides是爲解決第三方類庫而生的,Module是一個簡單工廠模式,Module可以包含創建類實例的方法,這些方法用Provides來標註
這裏寫圖片描述

注意@Inject並不是萬能,對於未知的事物,還是無能爲力的。比如,所熟悉的接口,接口並不能創建實例,這時,我們就不能使用@Inject註解。

  • 接口不能夠創建
  • 第三方庫的類不能夠創建
  • 配置對象必須配置!

如果兩種注入方式都存在,則按以下規則進行

步驟1:查找Module中是否存在創建該類的方法。
步驟2:若存在創建類方法,查看該方法是否存在參數
步驟2.1:若存在參數,則按從步驟1開始依次初始化每個參數
步驟2.2:若不存在參數,則直接初始化該類實例,一次依賴注入到此結束
步驟3:若不存在創建類方法,則查找Inject註解的構造函數,看構造函數是否存在參數
步驟3.1:若存在參數,則從步驟1開始依次初始化每個參數
步驟3.2:若不存在參數,則直接初始化該類實例,一次依賴注入到此結束

github地址:https://github.com/zhangyuesx215/Dagger2-MVP

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