在這篇文章中你會看到什麼:html
@Inject
是什麼@Component
是什麼@Inject
和 @Component
如何協同做戰。在介紹他們以前咱們來看一段咱們在項目中看到的相似的代碼:bash
public class ClassA{
ClassB classB = new ClassB();
ClassC classC = new ClassC("xxx",xxx);
.....
}
複製代碼
如你所見,當咱們在目標類初始化其餘類時,這些工做幾乎都是重複性的操做,咱們可不能夠用一種方案來替代這種操做,這時咱們所使用的 Dagger2
的成員 @Inject
和 @Component
就跳出來了,大聲喊道:我能夠~~~框架
@Inject
爲了實現以上功能,咱們須要完成如下步驟:ide
@Inject (Annotation)
來標註目標類中依賴類的實例對象@Inject (Annotation)
來標註所依賴的其餘類的 構造函數
。目標類 ClassA函數
public class ClassA{
@Inject
ClassB classB;// 使用 @Inject 標註依賴類的實例對象
@Inject
ClassC classC;
}
複製代碼
依賴類 ClassBpost
public class ClassB{
@Inject // 使用 @Inject 標註依賴類的構造函數
public ClassB(){}
....
}
複製代碼
依賴類 ClassCui
public class ClassC{
@Inject
public ClassC(XXX xxx, XXX xxx){
...
}
}
複製代碼
注意:在使用 @Inject 標註類的構造函數,只能標註一個構造函數,沒法標註多個。this
雖然 目標類 和 依賴類 都使用了@Inject
來標記,可是他們並無產生實在乎義上的聯繫,這時 @Component
就充當了媒婆的角色。spa
做用:將Module中產生的依賴對象自動注入到須要依賴實例的Container中.net
很明顯 @Component
是一個註解,那麼被 @Component
標記的類理所固然的被稱爲 註解類,而且該類必須是接口或抽象類。那麼下面咱們看一下這個媒婆是怎麼開展工做的:
1.@Component
標註類的實例必須存在目標類中 2.Component
會查找目標類中用 @Inject
註解標註的屬性 3. 查找到相應的屬性後,會接着查找該屬性對應的用 @Inject
標註的構造函數(這時候就發生聯繫了) 4. 剩下的工做就是初始化該屬性的實例並把實例進行賦值 具體過程以下圖:
@Inject
標註構造函數public class User {
private String mName = "jack chen";
private int mAge = 40;
@Inject
public User() { }
public String getName() {
return mName;
}
public void setName(String mName) {
this.mName = mName;
}
public int getAge() {
return mAge;
}
public void setAge(int mAge) {
this.mAge = mAge;
}
}
複製代碼
@Component
註解該類@Component
public interface UserComponent {
void inject(MainActivity mMainActivity);
}
複製代碼
@Inject
註解相關實例變量public class MainActivity extends AppCompatActivity {
@Inject
User mUser;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 這一句代碼是完成依賴注入的關鍵
DaggerUserComponent.builder().build().inject(this);
Log.e(TAG,"name : " + mUser.getName() + " age :" + mUser.getAge());
mUser.setAge(50);
mUser.setName("blur");
Log.e(TAG,"name2 : " + mUser.getName() + " age2 :" + mUser.getAge());
}
}
複製代碼
name : jack chen age :40
name2 : blur age2 :50
複製代碼
到此爲止,咱們已經實現了基本的基於 Dagger2
的依賴注入。下面咱們把過程再梳理一遍:
@Inject
註解標註目標類中依賴類的實例對象@Inject
註解標註依賴類的構造函數Component
(注入器)的 injectXXX
(Object)方法開始注入(injectXXX
方法名字是官方推薦的名字,以inject開始)Component
就像 目標類
和本身的 依賴類
的媒介,把目標類依賴的實例注入到目標類中,來初始化目標類中的依賴實例變量。