前言:

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

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

1 public class Computer{
2
3     private Cpu cpu;
4
5     public Computer(){
6         cpu= new Cpu();
7     }
8 }

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

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

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

1 public class Computer{
2
3      private Cpu cpu;
4
5      public Computer(Cpu cpu){
6          this.cpu= cpu;
7      }
8  }

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{@Injectprivate 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 {@Overrideprotected 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使用编译生成类 的功能.

 1 buildscript {
 2     repositories {
 3         jcenter()
 4     }
 5     dependencies {
 6         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 7     }
 8 }
 9
10 apply plugin: 'com.neenbedankt.android-apt' // 注释处理

dagger2 , 提供 dagger2支持 的功能.

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

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

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

配置完成后:

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

1 @Module
2 public class DataModule {
3
4     @Provides
5     UserModel provideUser() {
6         return new User();
7     }
8 }

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

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

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

 1 public class MainActivity extends ActionBarActivity {
 2
 3     private ActivityComponent mActivityComponent;
 4
 5     @Inject
 6     User user;
 7
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12
13         // 构建
14         mActivityComponent = DaggerActivityComponent.builder().dataModule(new DataModule()).build();
15
16         // 注入
17         mActivityComponent.inject(this);
18
19         ((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.username);
20     }
21     ...
22 }

附言:

Dagger2使用

详解Dagger2

神兵利器Dagger2

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

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

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

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

转载于:https://www.cnblogs.com/CharlesGrant/p/5312159.html

dagger2 依赖注入相关推荐

  1. Dagger2 知识梳理(1) Dagger2 依赖注入的两种方式

    一.资料推荐 最近这几天一直在看有关Dagger2有关的文章,感觉就是这东西真难用.真难懂,数次想要放弃,还好有网上大神的教程帮助,模模糊糊总算能把基本的几个概念跑通了. 这里首先推荐 牛晓伟 的下面 ...

  2. Android神匕首—Dagger2依赖注入框架详解

    简介 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife) Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagg ...

  3. Dagger2 依赖注入之@Provides 分析

    Dagger 下面主要分析,Dagger 中使用 @Provides 注解一个构造方法来提供依赖的过程. 举个栗子 老王再次开车去东北 还是那个老王 Person public class Perso ...

  4. Android:dagger2让你爱不释手-基础依赖注入框架篇

    前言 dagger2的大名我想大家都已经很熟了,它是解决Android或java中依赖注入的一个类库(DI类库).当我看到一些开源的项目在使用dagger2时,我也有种匆匆欲动的感觉,因此就立马想一探 ...

  5. 深入浅出依赖注入框架Dagger2

    目录 目录 依赖注入 依赖注入实现的三种方式 1. 构造注入 2. 属性注入 3. 接口注入 Dagger2 Dagger2的引入 不带Module的Inject方式(Inject+Component ...

  6. 依赖注入Dagger2详解

    为什么使用依赖注入 首先我们需要知道,人们在很长的一段时间里都是利用控制反转原则规定:应用程序的流程取决于在程序运行时对象图的建立.通过抽象定义的对象交互可以实现这样的动态流程.而使用依赖注入技术或者 ...

  7. Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。

    Koin.Dagger2.Hilt 目前都是非常流行的库,面对这么多层出不穷的新技术,我们该做如何选择,是一直困扰我们的一个问题. Hilt 与 Dagger2 区别并不大,Hilt就是对Dagger ...

  8. dagger2 注入_使用Dagger 2在GWT中进行依赖注入

    dagger2 注入 依赖注入是一种软件开发概念,其中为对象提供了创建所需的所有对象或值. GWT用户已经熟悉GIN,但已经不推荐使用此工具,因此不再支持它,因此使用GIN的应用程序当前确实需要告别. ...

  9. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入

    dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...

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

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

最新文章

  1. SpringBoot直接访问图片资源
  2. 猫和老鼠服务器维修有问题,猫和老鼠:游戏中大范围的断网掉线问题 玩家:土豆服务器就这样...
  3. 关于android设备管理器的一些分析
  4. 科幻画图片大全浇水机器人_从机器人到智能机器人,谭建荣院士为温肯师生揭秘新科技...
  5. 【2012百度之星/初赛下】A:度度熊就是要刷排名第一
  6. LiveVideoStack冬季招聘(高级策划编辑,市场BD主管)
  7. MessageBox、::MessageBox 、AfxMessageBox三者的区别
  8. 国产自主可控的代码自动生成工具SkyEye
  9. 利用jemalloc分析内存泄漏以及LD_PRELOAD
  10. 想看程序员的成长课这本书
  11. 英语听力学习方法,转自一牛人的博客
  12. ubuntu16.04 独立显卡驱动安装
  13. mce: [Hardware Error]: Machine check events logged
  14. python获取计算机时间_在Python中获取计算机的UTC偏移量
  15. Object Detection in 20 Years: A Survey 20年间的目标检测:综述
  16. C语言pow()函数:求x的y次方(次幂)
  17. 基于SaaS的教务系统平台设计构想
  18. 人大金仓命令行客户端工具KSQL系列2
  19. HM编码器代码阅读(30)——帧间预测之AMVP模式(五)运动估计
  20. npm run serve 报错问题 (npm ERR! code ELIFECYCLE)

热门文章

  1. VS2019错误提示:_CRT_SECURE_NO_WARNINGS的解决方法
  2. 最清晰的讲解各种梯度下降法原理与Dropout
  3. Python3.7 中Scipy和Numpy的安装(含下载资源)
  4. java---某人在玩游戏的时候输入密码123456后成功进入游戏(输错5次则被强行退出),要求用程序实现密码验证的过程。
  5. mysql数据库帐户_MySQL数据库用户帐号管理基础知识详解
  6. android 融云会话列表,为什么切换账号之后会话列表不刷新,还显示上一个帐号的内容?...
  7. php postgresql多条,PHP操作Postgresql封装类与应用完整实例
  8. 深度解析java内存原理
  9. 在access窗体中加图片_Access实战:一种不用按钮控件就能控制子窗体联动的方法...
  10. toybox执行linux程序,VirtualBox 的命令行用法