初学Dagger2

听说Dagger2 很长一段时间了 每次都是点开一个教程 看看别人的实现 但是每每读起来确实晦涩难懂 终于这两天又时间了 自己尝试着写一个简单的例子 我将以一个初学者的角度记录下 我的simple Dagger2

在我写Dagger2 例子之前 我看了很多篇文章 但是我看完后 无非记住了几个名字 比如 反转控制 依赖注入 等 对于涉及模式我不太懂 所以这个反转控制这个名词我也就云里雾里了 依赖注入 这是个什么东西?

还好我这个人不喜欢究理 对于不理解的东西 都是抱着先用后理解 就像依葫芦画瓢 这样用着用着 就发现他的道理了。或许这也是一个不错的方式。
我先给出Dagger2里的核心的几个需要实现的需要我们实现的类 这就是依葫芦画瓢的原始版本
XXModule 创造东西的机床 或者机器 也可以说是装对象的容器 XX名字有你定义 比如 本例子中的StudentModule
XX 机床或机器创造出来的东西 比如本例中的 Pen class
XXComponent 在写本片文章的时候我百度了下Component这个单词的意思
意为:n. 成分; 组分; 零件; [数] 要素;
adj. 成分的; 组成的; 合成的; 构成的;
[例句]Enriched uranium is a key component of a nuclear weapon
浓缩铀是核武器的关键组成部分。
结合上面的 XXModule,pen来看 XXComponent 对于学生去拿笔的这件事情来说 就相当于 把人和笔组装在了一个 这样不就意味着学生拿到笔了 换句话说 这个 XXComponent 把笔塞到了学生的手中 所以每当我们想拿笔的时候 我们不需要知道怎么制造这支笔 我们只管向 组装机(XXComponent)去要就行了 假如不用Dagger2 我们试想下实现方式

public class Student {

    private String studentName;
    private Pen pen;

    public Student(String name) {
        this.studentName = name;
        this.pen = new Pen("red");
    }
}

如果哪天 我改变了 Pen这个构造方法 增加了一个笔的类型 如 圆珠笔 毛笔 水彩笔 是不是所有new Pen的地方都需要去改 感觉麻烦不?

那现在我来说说我理解的 Dagger2是个什么东西吧。我先举个例子 比如 每个学生都有一支笔 假如他想用这支笔 那么他怎么能拿到这只笔呢? 他会从文具盒里去拿 别告诉我万一文具盒里没有笔。那么以一个程序员的角度来说就是 文具盒给学生提供了一支笔 可以想象 文具盒(XXModule)相当于一个机器 他能制造出各种笔来 也可以说是装对象的容器(当然笔肯定不是文具盒制造的 不过此次你可以想象成是) 通过去拿(XXComponent)这个动作 获得一支笔(Pen)
上面说了很大一段废话 只是为了说出我理解的Dagger2

下面从代码的角度来呈现

配置环境
工程的 build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'

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

allprojects {
    repositories {
        jcenter()
        maven { url 'https://dl.bintray.com/lhj/maven/'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

你需要添加 预编译
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ 这句

app 的 build.gradle
apply plugin: ‘com.android.application’
apply plugin: ‘com.neenbedankt.android-apt’

apply plugin: ‘com.neenbedankt.android-apt’ 添加这句(预编译插件)

然后添加 Dagger2的compile
compile ‘com.google.dagger:dagger:2.5’
compile ‘com.google.dagger:dagger-compiler:2.5’

我的app 的build.gradle的完整代码

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

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.admin.learndrager2"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    // 注释冲突
    packagingOptions {
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    provided 'org.glassfish:javax.annotation:10.0-b28'
    compile 'com.google.dagger:dagger:2.5'
    compile 'com.google.dagger:dagger-compiler:2.5'
    compile 'com.lhj:mvpbase:1.2'
}

万事俱备只差代码的实现了
根据上面说到的 要实现Dagger2我至少需要定义3个类 XXComponent XX类 XXModule 那我们应该毫不犹豫的去创建出这三个类 我已经创建好了 分别为 StudentComponent,StudentModule,Pen 我直接给出代码 已经在代码中解释了
Pen

/**
 * Created by admin on 2016/9/8.
 */
public class Pen {

    private String penColor = "红色";// 默认红色的一支笔

    @Inject // 表明 Pen 这个对象可以由 机器创造出来 并且可以由组装机组装给学生 Inject 英文为注入的意思此处 可以说 组装机可以把这支笔 注入到学生手中
    public Pen(String penColor) {
        this.penColor = penColor;
    }

    public String getPenColor() {
        return penColor;
    }
}

StudentModule

/**
 * Created by admin on 2016/9/8.
 */
@Module // 表明他是一个机器 他能生产创造出 东西来 你想创造的任何东西都可以友它来创造实现 比如此处我要生成出一支红色的笔 生产出的笔 可以提供给学生使用
public class StudentModule {

    @Provides // 次标注表明 可以提供给外部使用 此处意为 可以提供给学生使用
    Pen providePen() { // 固定格式 provide + class对象 如此处的Pen 所以变成方法名 providePen
        return new Pen("红色");
    }
}

StudentComponent 注意此类 为interface 接口 不为class

/**
 * Created by admin on 2016/9/8.
 */
@Component(modules = StudentModule.class) // 组装机的一头连接向 生产笔的机器 StudentModule(产生笔的机器)
public interface StudentComponent {

    void inject(StudentActivity studentActivity); // 组装机的另一头连接到了学生 【学生-组装机-生产笔的机器】
}

上面的两个类编写好后 注意你此时得 选择as上的build工具栏下的 make Project功能 make一下工厂 不然无法在下面的StudentActivity使用DaggerStudentComponent这份类 make Project后他会自动帮你产生这个DaggerStudentComponent类
StudentActivity 学生

public class StudentActivity extends AppCompatActivity {

    @Inject // 通过此 直接拿到机器帮你生产的产品 只要你自己的产品的构造方法标注此注解 并且也在生产机器中注册好了
    Pen pen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student);

        // DaggerStudentComponent 其实这才是 真正的组装机 连接到 生产机器 studentModule(new StudentModule()) 再连接到学生 inject(this) this 就是StudentActivity (学生)
        DaggerStudentComponent.builder().studentModule(new StudentModule()).build().inject(this);
        //好了 我们可以直接使用这支笔了 应为这支笔已经有 生成机器生产出来了 默认为红色的 我们toast 一下
        Toast.makeText(StudentActivity.this, pen.getPenColor(), Toast.LENGTH_SHORT).show();
        //接下来就是看你的表演了 定义更多的产品(class 对象) 让生产机器帮你生产(StudentModule 注意格式)
    }
}

代码非常少 主要定义好三个类 依葫芦画瓢就行 当然这只是一个组装机 你可以定义多个组装机 多个车床机器 那就看你自己的实现了
有不对地方请大家指出 此处仅仅是我个人的理解与看法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值