初学Dagger2

来源:互联网 发布:windows defender在哪 编辑:程序博客网 时间:2024/06/03 17:27

听说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 注意格式)    }}

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

0 0
原创粉丝点击