Android中使用Dagger2进行依赖注入

Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用Dagger2进行依赖注入。

Dagger2简单介绍

Dagger2,起源于Square的Dagger,是一个完全在编译期间进行的依赖注入框架,完全去除了反射。Dagger2是通过依赖注入让你少写很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块。

Dagger2实例

Dagger2环境搭建

project的build.gradle添加

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

module的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注解
}

代码实现

Usermodele 是一些基本消息

public class UserModel {

    private String id;
    private String name;
    private String gender;

    public UserModel() {
    }

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

    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;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}


Module其实就是一个依赖的制造工厂。我们只需要为其添加制造依赖的方法即可。

@Module
public class ActivityModule {

    @Provides
    public UserModel provideUserModel() {
        return new UserModel("1", "hjx", "man");
    }
}

注解@Module注明本类属于Module ,注解@Provides注明该方法是用来提供依赖对象的特殊方法 。
一个完整的Module必须拥有@Module与@Provides注解 。

Component就是一个将Module生成的实例注入Container中的注入器

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

@Component使用modules指向使用的Module的集合。 所有的Component都必须以接口形式定义。Dagger2框架将自动生成Component的实现类,对应的类名是Dagger×××××,这个例子中对应的实现类是DaggerActivityComponent,添加注入方法,一般使用inject做为方法名,方法参数为对应的Container。

Container就是可以被注入依赖关系的容器,这里的容器为Activity。具体实现如下

public class MainActivity extends AppCompatActivity {

    private ActivityComponent mActivityComponent;

    @Inject
    UserModel mUserModel;   //不能为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:" + mUserModel.getId() + " Name: " + mUserModel.getName()
                 + "  Gender: " + mUserModel.getGender());
    }
}

Container中@Inject标记需要被注入的对象,mActivityComponent.inject(this)表示将调用Component的实现类将Module的生成的对象注入到mUserModel中。

到这为止,怎样使用Dagger2进行依赖注入的小demo已经完成了,代码已经上传到Github

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值