Dagger2----一个最简单的Dagger2依赖的实现

Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,Dagger2分析所有依赖并生成代码将这些依赖组织在一起,关于更多的Dagger2理论介绍请移步详解Dagger2(中文版)Tasting Dagger 2 on Android(可能需要梯子)。

本次我们主要介绍如何完成一个最简单的Dagger2依赖项目,其中包括dagger2的Gradle添加和最基本注入关系处理。首先介绍注解的几个概念:

  • @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖
  • @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
  • @Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
  • @Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。

接下来就让我们进入代码部分吧,首先新建项目,在Project的build.gradle里面添加apt classpath如下:

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

在app 的build.gradle文件里面添加Dagger2依赖,如下所示:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.0 rc2"

    defaultConfig {
        applicationId "com.tt.simpledagger2demo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    apt 'com.google.dagger:dagger-compiler:2.2'
    compile 'com.google.dagger:dagger:2.2'
    provided 'javax.annotation:jsr250-api:1.0'
    compile 'com.jakewharton:butterknife:7.0.1'
}

注意apply plugin: 'com.neenbedankt.android-apt'这一句,不要忘了喔。
完成以上步骤就完成了Dagger2的gradle依赖。
编译一下不报错那就go on吧。
新建UserModel实体类,我们在实体类内部模拟数据的生成就好(PS,为了简单),代码如下:

public class UserModel {
    private String userName = "123";
    private String userPass = "456";
    private String address;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public UserModel() {
    }

    public UserModel(String userName, String userPass, String address) {
        this.userName = userName;
        this.userPass = userPass;
        this.address = address;
    }
}

完成数据层实体部分的编写,接下来我们就要把数据注入到MainActivity中,新建ActivityModule:

@Module
public class ActivityModule {
    @Provides
    UserModel provideUserModel() {
        return new UserModel();
    }
}

如上使用@Module标识我们ActivityModule类提供依赖,接着我们使用@Component标识注入:

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

在MainActivity中,初始化Dagger2注入:

@Bind(R.id.textview)
    TextView mTextview;
    private ActivityComponent mActivityComponent;
    @Inject
    UserModel userModel;

在onCreate函数中修改如下:

mActivityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule()).build();
        mActivityComponent.inject(this);
        mTextview.setText(userModel.getUserName()+"----"+userModel.getUserPass());

小伙伴们,是不是突然感觉脸要绿了,为啥呢?好像是DaggerActivityComponent这个东东不存在唉,是不是哪里错了啊?

哈哈,其实并没有,前面也说了Dagger2是首个使用生成代码实现完整依赖注入的框架,所以这种依赖类只有rebuild以后才能有喔,赶紧rebuild一下点绿色三角执行一下,我的执行结果如下:
这里写图片描述

完整源码:完整源码
参考:Dependency Injection with Dagger 2
使用Dagger 2进行依赖注入

最新文章更新在微信公众号上,欢迎关注获取详情:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值