本文適合于Dagger2 零基礎(chǔ)學(xué)習(xí)。本次閱讀需要五分鐘。
Dagger2 主要提供了6種注解,這里我主要講其中的四種
@Inject @Provide @Module @Component
Dagger2是通過依賴注入完成類的初始化。
**這個過程需要三部分:
依賴提供方,依賴注入容器,依賴需求方
**
@Inject Inject主要有兩個作用
1.作為依賴注提供方使用:在構(gòu)造函數(shù)上,通過標(biāo)記構(gòu)造函數(shù)讓Dagger2來使用(Dagger2通過Inject標(biāo)記可以在需要這個類實例的時候來找到這個構(gòu)造函數(shù)并把相關(guān)實例new出來)從而提供依賴
2.作為依賴需求方:標(biāo)記在需要依賴的變量Dagger2會幫助初始化,被我們使用。@Provide 用Provide來標(biāo)注一個方法,該方法可以在需要提供依賴時被調(diào)用,從而把預(yù)先提供好的對象當(dāng)做依賴給標(biāo)注了@Inject的變量賦值。provide主要用于標(biāo)注Module里的方法
@Module 用Module標(biāo)注的類是專門用來提供依賴的。注意Module類是提供依賴的一個集合,通常它自身是需要被依賴的。而真正被依賴的都是通過@Provide標(biāo)注的方法提供,所以@Module和@Provide是聯(lián)合使用的。
-
@Component Component一般用來標(biāo)注接口,被標(biāo)注了Component的接口在編譯時會產(chǎn)生相應(yīng)的類的實例來作為提供依賴方和需要依賴方之間的橋梁,把相關(guān)依賴注入到其中。
圖片來自于[Maydaaa](https://dreamerhome.github.io/2016/07/11/dagger%20for%20code/)
**對上述內(nèi)容請記住依賴注入過程需要三部分:
依賴提供方,依賴注入容器,依賴需求方
**
對上述描述不清楚的,請先看下面的案例,再去理解上面的內(nèi)容。
案例
常規(guī)做法
我們要在TestUser 中創(chuàng)建一個User
public class User {
String userName;
int age;
}
如果我們想使用User 我們需要new出來然后使用
public class TestUser {
User user;
public static void main(String[] arg) {
TestUser testUser = new TestUser();
testUser.user = new User();
testUser.user.userName = "name";
}
}
在上述例子中我們?nèi)绻M褂肬ser我們需要new一個User然后才能使用
下面我們通過Dragger2去完成上述過程
-
依賴注入方
通過@Inject和@Module&&@Provide可以去完成依賴注入方
先講@Module&&@Provide
我們在TestUser 中想使用User那么我們需要一個Model我們的@Model是用在類上的。
我們創(chuàng)建了一個@Module TestUserModule@Module public class TestUserModule { @Provides User provideUser(){ return new User(); } }
我們通過上述代碼就完成的依賴注入方。這里解釋一下@Module是一個依賴提供方的合集,本身一般是不作為內(nèi)容被提供的。User才是我們需要提供的內(nèi)容
比如我們現(xiàn)在希望TestUserModule 同時提供一個Account
@Module
public class TestUserModule {
@Provides
User provideUser(){
return new User();
}
@Provides
Account provideAccount(){
return new Account();
}
}
-
依賴注入容器
依賴注入容器只是一個接口,用來描述被注入的對象TestUser 需要哪些modules = TestUserModule.class
@Component(modules = TestUserModule.class)
public interface TestUserComponent {
void inject(TestUser testUser);
}
注入容器本身只是一個接口interface -
依賴需求方
public class TestUser {
@Inject
User user;
public static void main(String[] arg) {
TestUser testUser = new TestUser();
DaggerTestUserComponent.builder().build().inject(testUser);
System.out.println(testUser.user.name);
}
}
我們要打印出name System.out.println(testUser.user.name);
在使用User前要做兩件事情
- DaggerTestUserComponent.builder().build().inject(testUser);
DaggerTestUserComponent是在編譯后編譯器幫我們生成的。生成的格式是Dagger+我們自定義的容器 - @Inject
User user;
通過我們剛剛的DaggerTestUserComponent.builder().build().inject(testUser);Dagger2會幫我們把user初始化。
注意事項
@Module
Dagger2是怎么選擇依賴提供的呢,規(guī)則是這樣的:
步驟1:查找Module中是否存在創(chuàng)建該類的方法。
步驟2:若存在創(chuàng)建類方法,查看該方法是否存在參數(shù)
步驟2.1:若存在參數(shù),則按從步驟1開始依次初始化每個參數(shù)
步驟2.2:若不存在參數(shù),則直接初始化該類實例,一次依賴注入到此結(jié)束
步驟3:若不存在創(chuàng)建類方法,則查找Inject注解的構(gòu)造函數(shù),看構(gòu)造函數(shù)是否存在參數(shù)
步驟3.1:若存在參數(shù),則從步驟1開始依次初始化每個參數(shù)
步驟3.2:若不存在參數(shù),則直接初始化該類實例,一次依賴注入到此結(jié)束