最簡單的應用
- 配置環境在根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:若不存在參數,則直接初始化該類實例,一次依賴注入到此結束