Dagger2使用(四)一个简单的Dagger依赖注入过程

来源:互联网 发布:code.org 是什么软件 编辑:程序博客网 时间:2024/06/08 16:02

        实例为一个简单的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代码如下所示。

@Modulepublic 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());    }}


原创粉丝点击