Dagger2使用(四)一個簡單的Dagger依賴注入過程

        實例爲一個簡單的Android應用,使用AndroidStudio;創建了一個BookModel,在activity中使用TextView顯示該BookModel信息。

        未使用Dagger的常規實現如下:

public class TestDaggerMainActivity extends BaseActivity {
    TextView mShowInfoView;
    BookModel mBook;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_dagger_main);
        //
        initDatas();
        initViews();
        showBookinfo();
    }

    private void initDatas() {
        mBook = new BookModel("testBook", 25);
    }

    private void initViews() {
        mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
    }
    private void showBookinfo() {
        mShowInfoView.setText(mBook.toString());
    }
}


        BookModel.java的定義:

public class BookModel {
    private String name;
    private float price;

    public BookModel() {
    }
    public BookModel(String name, float price) {
        this.name = name;
        this.price = price;
    }
    //getter setter省略
    @Override
    public String toString() {
        return "[" + name + "\t" + price + "元]";
    }
}

1.  配置build.gradle

        1)需要配置apt插件,沒有這插件,dagger可能不會正常工作,特別是在Android studio中。

        2)需要配置“javax.annotation”,Dagger2中會用到@Generated註解,而javax.anotation.generated在Android API 中沒有。

apply plugin: 'android-apt'

//
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

//dependencies中的配置
//for dagger2 
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
// Dagger2中會用到@Generated註解,而javax.anotation.generated在Android API 中是沒有.
compile 'org.glassfish:javax.annotation:10.0-b28'

 

2.     構建依賴

        Dagger2中,這個負責提供依賴的組件被稱爲Module。使用@Module標識類型爲module,並用@Provides標識提供依賴的方法。

        構建的ActivityModule代碼如下所示。

@Module
public class ActivityModule {
    @Provides
    BookModel provideUserModel() {
        return new BookModel("testBook", 25);
    }
}

 

3.     構建Injector

        連接提供依賴和消費依賴對象的組件被稱爲Injector;Dagger2中,我們將其稱爲Component。

        Component是一個使用@Component標識的Javainterface。interface的inject方法需要一個消耗依賴的類型對象作爲參數。

        注意:這裏必須是真正消耗依賴的類型TestDaggerMainActivity(實際的消耗依賴的類),而不可以寫成其父類等。

        ActivityComponent代碼如下,代碼編譯後,會自動生成實現類“DaggerActivityComponent”,在構建依賴注入時需要用到。

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

 

4.     完成依賴注入

        在TestDaggerMainActivity中構建Injector對象,完成注入。

        注:BookModel mBook 不能定義爲private。注:BookModel mBook 不能定義爲private。

public class TestDaggerMainActivity extends BaseActivity {
    private ActivityComponent mActivityComponent;
    TextView mShowInfoView;
//
    @Inject
    BookModel mBook;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_dagger_main);
        //
        initDatas();
        initViews();
        showBookinfo();
    }

    private void initDatas() {
//構建Injector對象及完成注入
        mActivityComponent = DaggerActivityComponent.builder()
.activityModule(new ActivityModule()).build();
        mActivityComponent.inject(this);
    }

    private void initViews() {       
        mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
    }
    private void showBookinfo() {
        mShowInfoView.setText(mBook.toString());
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章