前言:

当 mvp + dagger2 + rxjava 三者遇上,架构更加清晰,代码更加灵活,巧妙结合。

依赖注入:是为了解耦,达到高内聚低耦合的目的,保证代码的健壮性、灵活性和可维护性。

 public class Computer{

     private Cpu cpu;

     public Computer(){
cpu= new Cpu();
}
}

Computer类持有了对Cpu实例的引用,称之为Computer类对Cpu类有一个依赖。

依赖注入则是指通过注入的方式实现类与类之间的依赖。

1、构造注入:通过构造函数传参,给依赖的成员变量赋值,因此实现注入。

 public class Computer{

      private Cpu cpu;

      public Computer(Cpu cpu){
this.cpu= cpu;
}
}

2、接口注入:实现事先定义好的接口方法,通过方法传参的方式实现注入。

public interface Injection<T>{

    void inject(T t);
} public class Computer implements Injection<Cpu>{ private Cpu cpu; public Computer(){
} public void inject(Cpu cpu){
this.cpu= cpu;
}
}

3、注解注入:使用Java注解,在编译阶段生成代码实现注入或者是在运行阶段通过反射实现注入。

public class Computer{

     @Inject
private Cpu cpu; public Computer(){
}
}

Dagger2是通过Java注解在编译期来实现依赖注入的。

Dagger2的常用注解:

@Inject:

1、用来标记需要依赖的变量,须为它提供依赖;

2、是用来标记构造函数,Dagger2通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把相关实例构造出来,以此来为被@Inject标记了的变量提供依赖;

@Module:

用于标注提供依赖的类。当构造函数带有参数,或者是第三方库类时,所须使用的。

@Provides:

用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用,把预先提供好的对象当做依赖给标注了@Inject的变量赋值;

@Component:

用于标注接口,是依赖需求方和依赖提供方之间的桥梁。被Component标注的接口在编译时会生成该接口的实现类(如果@Component标注的接口为CarComponent,则编译期生成的实现类为DaggerCarComponent),我们通过调用这个实现类的方法完成注入;

@Scope:

用于自定义注解,我能可以通过@Scope自定义的注解来限定注解作用域,实现局部的单例;

@Singleton:

其实就是一个通过@Scope定义的注解,我们一般通过它来实现全局单例。但实际上它并不能提前全局单例,是否能提供全局单例还要取决于对应的Component是否为一个全局对象。

案例一:

没有使用注入时:

public class MainActivity extends ActionBarActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
User user = new User();
((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.name);
}
...
}

使用注入时:

设置 build.gradle , 并添加依赖库.

android-apt , 提供 dagger2使用编译生成类 的功能.

 buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
} apply plugin: 'com.neenbedankt.android-apt' // 注释处理

dagger2 , 提供 dagger2支持 的功能.

 compile 'com.google.dagger:dagger:2.0.2' // dagger2
compile 'com.google.dagger:dagger-compiler:2.0.2' // dagger2

annotation , 提供 java注释解析 的功能.

 provided 'javax.annotation:jsr250-api:1.0' // Java标注

配置完成后:

首先定义Module类来生成依赖对象。使用@Provides是用来标注具体提供依赖对象的方法。

 @Module
public class DataModule { @Provides
UserModel provideUser() {
return new User();
}
}

定义component:注入器,加上modules = {DataModule.class},是用来告诉Dagger2提供依赖的是DataModule这个类:

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

最后使用方式:构建时,使用dataModule(new DataModule()),注入器DaggerActivityComponent把DataModule提供的依赖 注入到 MainActivity中,注入,使用

 public class MainActivity extends ActionBarActivity {

     private ActivityComponent mActivityComponent;

     @Inject
User user; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 构建
mActivityComponent = DaggerActivityComponent.builder().dataModule(new DataModule()).build(); // 注入
mActivityComponent.inject(this); ((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.username);
}
...
}

附言:

Dagger2使用

详解Dagger2

神兵利器Dagger2

当复仇者联盟遇上Dagger2、RxJava和Retrofit的巧妙结合

MVP+Dagger2+Retrofit实现更清晰的架构

Android 依赖注入: Dagger 2 实例讲解(一)

Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料

dagger2 依赖注入的更多相关文章

  1. Android——初探Dagger2依赖注入

    1,在做项目时,经常需要在一个对象里去创建另一个对象的示例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,很容易就会碰到修改一个小需求需要大面积的修改各种代码, ...

  2. 浅析Dagger2依赖注入实现过程

    Dragger2是Android应用开发中一个非常优秀的依赖注入框架.本文主要通过结合Google给出的MVP开发案例todo-mvp-dagger(GitHub连接地址:https://github ...

  3. 用Dagger2在Android中实现依赖注入

    依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的.使应用开发更加可扩展,更容易维护.通过本文你会学到如何使用Dagger2来处理依赖. 简介 如果以对象需要另外的一个对象才能 ...

  4. Android 使用dagger2进行依赖注入(基础篇)

    0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...

  5. Android项目使用Dagger2进行依赖注入

    原文链接:http://code.tutsplus.com/tutorials/dependency-injection-with-dagger-2-on-android–cms-23345 依赖注入 ...

  6. 依赖注入框架之dagger2

    主页: https://github.com/google/dagger 历史 * Dagger1是由Square公司受到Guice(https://github.com/google/guice)启 ...

  7. [Android]使用Dagger 2进行依赖注入 - Producers(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...

  8. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

  9. [Android]依赖注入框架google的dagger

    分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...

随机推荐

  1. Fiddler--QuickExec

    QuickExec在Fiddler中提供了比较快捷的功能服务. 在QuickExec输入框中输入命令,能快速地得到想要的结果. 快捷键:打开Fiddler后,按“Alt+q”,可将光标定位到Quick ...

  2. linux在线安装JDK(1.8版本)

    在线下载JDK 命令: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-sec ...

  3. python学习02

    python的数据类型 程序=数据类型+算法 1.数据类型:数据型,字符串,列表list,字典dict,set集合(),tuple元组() 1)数据型 int,整数型,理论上是无限大,不过受到机器内存 ...

  4. BMP文件解析

    目录 BMP文件简介 BMP文件格式 位图头 位图信息 调色板 位图数据 C语言代码 获取文件大小 获取文件尺寸 获取文件偏移量 读取文件数据示例 一个问题 完整程序 BMP文件简介 BMP(全称Bi ...

  5. 【汇编语言】Doxbox 0.74 修改窗口大小

    1.打开Doxbox安装路径,找到DOXBox 0.74-2 Option.bat,双击打开. 2.找到windowresolution和output,将其值修改为下图中的值. 注意:图中,1280x ...

  6. 嵌套调用less函数时参数值的变化及提取部分-遁地龙卷风

    在a.less中导入base.lessa.less中的代码 .animate-ripple-ink{ .animation(ripple .5s linear;{ 100%{ opacity:; .t ...

  7. js高级知识---词法分析和AO 链

    转载自https://www.cnblogs.com/OceanHeaven/p/4957704.html 上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代 ...

  8. Codeforces 877E - Danil and a Part-time Job 线段树+dfs序

    给一个有根树,1e5个节点,每个节点有权值0/.1,1e5操作:1.将一个点的子树上所有点权值取反2.查询一个点的子树的权值和   题解: 先深搜整颗树,用dfs序建立每个点对应的区间,等于把树拍扁成 ...

  9. Hadoop第一式:配置Linux环境

    所有操作在虚拟机下完成,虚拟机软件选用VMware Workstation Pro 12 (后文简称为VM) 关于Linux安装不再阐述一.网络环境配置 1)Windows界面 首先在VM页面,点击虚 ...

  10. SQL Server2012如何导出sql脚本并且还原数据库

    一  备份数据库 1  选择某一个数据库,右键依次选择:任务==>生成脚本: 2  选择要编写脚本的数据库对象,注意此处可以选择特定的数据库对象,我们可以选择我们需要备份的数据表. 3   在当 ...