Dagger 2 系列(二) -- 基礎篇:@Inject、@Component

Dagger2

  • 該系列博客的最終目標: 搭建 MVP + Dagger2 框架
  • 該系列博客包含如下幾篇內容:
  1. Dagger 2 系列(一) -- 前奏篇:依賴注入的基本介紹
  2. Dagger 2 系列(二) -- 基礎篇:@Inject、@Component
  3. Dagger 2 系列(三) -- 基礎篇:@Module 和@Provides
  4. Dagger 2 系列(四) -- 基礎篇:@Named 和 @Qualifier
  5. Dagger 2 系列(五) -- 進階篇:@Scope 和 @Singleton

在這篇文章中你會看到什麼:html

  1. @Inject 是什麼
  2. @Component 是什麼
  3. @Inject@Component 如何協同做戰。

1. 前提

在介紹他們以前咱們來看一段咱們在項目中看到的相似的代碼:bash

public class ClassA{
    ClassB classB = new ClassB();
    ClassC classC = new ClassC("xxx",xxx);
    .....
}
複製代碼

如你所見,當咱們在目標類初始化其餘類時,這些工做幾乎都是重複性的操做,咱們可不能夠用一種方案來替代這種操做,這時咱們所使用的 Dagger2 的成員 @Inject@Component 就跳出來了,大聲喊道:我能夠~~~框架

2. @Inject 是什麼?

@Inject爲了實現以上功能,咱們須要完成如下步驟:ide

  1. 須要用註解 @Inject (Annotation) 來標註目標類中依賴類的實例對象
  2. 一樣用註解 @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

3. @Component 是什麼

做用:將Module中產生的依賴對象自動注入到須要依賴實例的Container中.net

很明顯 @Component 是一個註解,那麼被 @Component 標記的類理所固然的被稱爲 註解類,而且該類必須是接口或抽象類。那麼下面咱們看一下這個媒婆是怎麼開展工做的:

1.@Component 標註類的實例必須存在目標類中 2.Component會查找目標類中用 @Inject 註解標註的屬性 3. 查找到相應的屬性後,會接着查找該屬性對應的用 @Inject 標註的構造函數(這時候就發生聯繫了) 4. 剩下的工做就是初始化該屬性的實例並把實例進行賦值 具體過程以下圖:

@Inject 和 @Component 協同過程流程圖

4. 簡單使用

  • 依賴類 -- User ,使用 @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;
    }
}
複製代碼
  • 媒介類 -- UserComponentm ( 接口), 使用 @Component 註解該類
@Component
public interface UserComponent {
    void inject(MainActivity mMainActivity);
}
複製代碼
  • 目標類 -- MainActivity,使用 @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
複製代碼

5. 總結

到此爲止,咱們已經實現了基本的基於 Dagger2 的依賴注入。下面咱們把過程再梳理一遍:

  1. @Inject 註解標註目標類中依賴類的實例對象
  2. @Inject 註解標註依賴類的構造函數
  3. 若其餘類還依賴於其餘的類,則重複進行上面2個步驟
  4. 調用 Component(注入器)的 injectXXX(Object)方法開始注入(injectXXX方法名字是官方推薦的名字,以inject開始)

Component 就像 目標類 和本身的 依賴類 的媒介,把目標類依賴的實例注入到目標類中,來初始化目標類中的依賴實例變量。

5.參考文章


Dagger 詳解

這就是Dagger2

Dagger2 入門實踐

Android:dagger2讓你愛不釋手-終結篇

最簡單的Dagger2入門教程

Android:dagger2讓你愛不釋手-基礎依賴注入框架篇

相關文章
相關標籤/搜索