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例如以下:

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

在app 的build.gradle文件中面加入Dagger2依赖,例如以下所看到的:

  1. apply plugin: 'com.android.application'
  2. apply plugin: 'com.neenbedankt.android-apt'
  3. android {
  4. compileSdkVersion 23
  5. buildToolsVersion "24.0.0 rc2"
  6. defaultConfig {
  7. applicationId "com.tt.simpledagger2demo"
  8. minSdkVersion 15
  9. targetSdkVersion 23
  10. versionCode 1
  11. versionName "1.0"
  12. }
  13. buildTypes {
  14. release {
  15. minifyEnabled false
  16. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  17. }
  18. }
  19. }
  20. dependencies {
  21. compile fileTree(include: ['*.jar'], dir: 'libs')
  22. testCompile 'junit:junit:4.12'
  23. compile 'com.android.support:appcompat-v7:23.3.0'
  24. apt 'com.google.dagger:dagger-compiler:2.2'
  25. compile 'com.google.dagger:dagger:2.2'
  26. provided 'javax.annotation:jsr250-api:1.0'
  27. compile 'com.jakewharton:butterknife:7.0.1'
  28. }

注意apply plugin: 'com.neenbedankt.android-apt'这一句,不要忘了喔。

完毕以上步骤就完毕了Dagger2的gradle依赖。

编译一下不报错那就go on吧。

新建UserModel实体类。我们在实体类内部模拟数据的生成就好(PS,为了简单),代码例如以下:

  1. public class UserModel {
  2. private String userName = "123";
  3. private String userPass = "456";
  4. private String address;
  5. public String getUserName() {
  6. return userName;
  7. }
  8. public void setUserName(String userName) {
  9. this.userName = userName;
  10. }
  11. public String getUserPass() {
  12. return userPass;
  13. }
  14. public void setUserPass(String userPass) {
  15. this.userPass = userPass;
  16. }
  17. public String getAddress() {
  18. return address;
  19. }
  20. public void setAddress(String address) {
  21. this.address = address;
  22. }
  23. public UserModel() {
  24. }
  25. public UserModel(String userName, String userPass, String address) {
  26. this.userName = userName;
  27. this.userPass = userPass;
  28. this.address = address;
  29. }
  30. }

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

  1. @Module
  2. public class ActivityModule {
  3. @Provides
  4. UserModel provideUserModel() {
  5. return new UserModel();
  6. }
  7. }

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

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

在MainActivity中,初始化Dagger2注入:

  1. @Bind(R.id.textview)
  2. TextView mTextview;
  3. private ActivityComponent mActivityComponent;
  4. @Inject
  5. UserModel userModel;

在onCreate函数中改动例如以下:

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

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

哈哈。事实上并没有。前面也说了Dagger2是首个使用生成代码实现完整依赖注入的框架。所以这样的依赖类仅仅有rebuild以后才干有喔。赶紧rebuild一下点绿色三角运行一下,我的运行结果例如以下:

完整源代码:完整源代码

參考:Dependency Injection with Dagger 2

使用Dagger 2进行依赖注入

Dagger2----一个最简单的Dagger2依赖的实现的更多相关文章

  1. Linux下一个最简单的不依赖第三库的的C程序(1)

    如下代码是一段汇编代码,虽然标题中使用了C语言这个词语,但下面确实是一段汇编代码,弄清楚了这个代码,后续的知识点才会展开. simple_asm.s: #PURPOSE: Simple program ...

  2. Linux下一个最简单的不依赖第三库的的C程序(2)

    一个最简单的C程序,如下: main.c: int main() { char *str = "Hello World"; ; } 在64位平台上编译一个32位的程序,如下:(32 ...

  3. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  4. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  5. [编译] 1、第一个makefile简单例子

    前言 本篇用一个最简单的例子引入makefile,教你编写第一个makefile 正文 在Download/aa文件夹下有a.c和makefile文件 litao@litao:~/Downloads/ ...

  6. Skinned Mesh原理解析和一个最简单的实现示例

    Skinned Mesh 原理解析和一个最简单的实现示例   作者:n5 Email: happyfirecn##yahoo.com.cn Blog: http://blog.csdn.net/n5 ...

  7. 简述一个javascript简单继承工具的实现原理

    背景 由于本人非常希望能够开发自己的游戏,所以业余时间一直在想着能不能自己一些好玩又有趣的东西出来,最近随着steam上众多独立游戏的爆发,感觉自己又燃烧了起来,所以又拾起了很久以前的一个2d引擎,决 ...

  8. Epii.js 一个极其简单的Js模板引擎

    Epii.js 简约而不简单的Js模板引擎 Epii.js 简约而不简单的JavaScript模板引擎 # 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑 ...

  9. 一个极为简单的方法实现本地(离线)yum安装rpm包

    首先,我要关心的问题仍然是如何离线或者本地yum安装rpm包?这其中的关键当然是获取rpm包到本地,这其中的麻烦事是去解析依赖关系.然而,我发现一个极为简单的方法可以不用操心rpm包依赖关系,不多不少 ...

随机推荐

  1. 指定PHP编码

    有时候我们写好的PHP页面在网页中打开是乱码的,就需要指定编码,即加入代码: header("content-type:text/html;charset=utf-8"); 位置图 ...

  2. sqllite相关总结

    一,sqlite 简介 前面写了一篇博文讲如何在 C# 中使用 ADO 访问各种数据库,在移动开发和嵌入式领域也有一个轻量级的开源关系型数据库-sqlite.它的特点是零配置(无需服务器),单磁盘文件 ...

  3. jQuery-鼠标经过显示大图并跟随鼠标效果方法封装

    //copyright c by zhangxinxu 2019-1-15 /*由于大图绑定在href属性中,故一般而言,需使用a标签的href指向大图.仅支持png,gif,jpg,bmp四种格式的 ...

  4. 零基础入门学习Python(31)--永久存储:腌制一缸美味的泡菜

    知识点 pickle( 泡菜 ) 模块介绍: pickle模块作用是持久化的储存数据. 在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用, 而不是简单的放入 ...

  5. zabbix源码安装后,设置为服务启动和关闭

    zabbix源码安装,使用service启动与关闭服务 1. zabbix客户端的系统服务脚本 1.1 拷贝启动脚本 zabbix的源码提供了系统服务脚本,在/usr/local/src/zabbix ...

  6. Python之面向对象函数式编程

    Python之面向对象函数式编程 函数式编程的根本就是用 def 去模拟数学式的编程逻辑. 类似与 y = 2*x + 1 ,当x = 3 时,函数的结果y就得7. def test(x): retu ...

  7. rbac组件之权限初始化(五)

    当用户登陆后,根据用户的角色要为用户生成对应的权限菜单,此时需要将登陆的用户信息获取且获取角色信息,从数据库中获取菜单以及权限信息,并且存入session中. 1.权限流程 第一次请求的页面是登陆页面 ...

  8. 【转载】Hadoop NameNode 高可用 (High Availability) 实现解析

    转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/ NameNode 高可用整体架构概述 在 Had ...

  9. Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  10. bzoj5105 晨跑 数论lcm

    “无体育,不清华”.”每天锻炼一小时,健康工作五十年,幸福生活一辈子”在清华,体育运动绝对是同学们生活中 不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不过由于种种原因,每天都早 ...