Dagger2的簡單使用

一.Dagger2介紹

Dagger2 是一款 Java 平臺的依賴注入庫。


依賴注入相關概念:

依賴(Dependency):如果在 Class A 中,有個屬性是 Class B 的實例,則稱 Class B 是 Class A 的依賴,本文中我們將 Class A 稱爲宿主(Host),並且全文用 Host 表示;Class B 稱爲依賴(Dependency),並且全文用 Dependency 表示。一個 Host 可能是另外一個類的 Dependency。

宿主(Host):如果 Class B 是 Class A 的 Dependency,則稱 Class A 是 Class B 的宿主(Host)。

依賴注入:如果 Class B 是 Class A 的 Dependency,B 的賦值不是寫死在了類或構造函數中,而是通過構造函數或其他函數的參數傳入,這種賦值方式我們稱之爲依賴注入。


二.Dagger2使用

project的build.gradle添加

dependencies {
    ... // 其他classpath
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
}

app的build.gradle添加

apply plugin: 'com.neenbedankt.android-apt'//添加apt命令

dependencies {
    apt 'com.google.dagger:dagger-compiler:2.0.2' //指定註解處理器
    compile 'com.google.dagger:dagger:2.0.2'  //dagger公用api
    provided 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax註解
}
PersonModel是一些基本消息

public class PersonModel {

    private String id;
    private String name;

    public PersonModel(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Module是一個依賴的製造工廠
@Module
public class ActivityModule {

    @Provides
    public PersonModel providePersonModel() {
        return new PersonModel("1", "zjx");
    }
}

Component就是一個將Module生成的實例注入Container中的注入器

@Component(modules = ActivityModule.class)
public interface ActivityComponent {
    void inject(MainActivity mainActivity);
}


Container就是可以被注入依賴關係的容器,這裏的容器爲Activity

public class MainActivity extends AppCompatActivity {

    private ActivityComponent mActivityComponent;

    @Inject
    PersonModel personModel;   //不能爲private
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivityComponent = DaggerActivityComponent.builder().
                activityModule(new ActivityModule()).build();
        mActivityComponent.inject(this);

        ((TextView) findViewById(R.id.textView)).
                setText("ID:" + personModel.getId() + " Name: " + personModel.getName() );
    }
}

Container中@Inject標記需要被注入的對象,mActivityComponent.inject(this)表示將調用Component的實現類將Module的生成的對象注入到personModel中,到此講解了dagger2的簡單使用。

發佈了32 篇原創文章 · 獲贊 67 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章