1:Dagger2是啥

Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护的然后现在把这堆东西扔给Google维护了。

一般的IOC框架都是通过反射来实现的,但Dagger2作为Android端的IOC框架,为了不影响性能,它是通过apt动态生成代码来实现的.

Dagger2主要分为三个模块:

  1. 依赖提供方Module,负责提供依赖中所需要的对象,实际编码中类似于工厂类
  2. 依赖需求方实例,它声明依赖对象,它在实际编码中对应业务类,例如Activity,当你在Activity中需要某个对象时,你只要在其中声明就行,声明的方法在下面会讲到.
  3. 依赖注入组件Component,负责将对象注入到依赖需求方,它在实际编码中是一个接口,编译时Dagger2会自动为它生成一个实现类.

Dagger2的主要工作流程分为以下几步:

  1. 将依赖需求方实例传入给Component实现类
  2. Component实现类根据依赖需求方实例中依赖声明,来确定该实例需要依赖哪些对象
  3. 确定依赖对象后,Component会在与自己关联的Module类中查找有没有提供这些依赖对象的方法,有的话就将Module类中提供的对象设置到依赖需求方实例中

通俗上来讲就好比你现在需要一件衣服,自己做太麻烦了,你就去商店买,你跟商店老板说明你想要购买的类型后,商店老板就会在自己的衣服供应商中查找有没有你所说的类型,有就将它卖给你.其中你就对应上面所说的依赖需求方实例,你只要说明你需要什么,商店老板则对应Component实现类,负责满足别人的需求,而衣服供应商则对应Module类,他负责生产衣服.也许这里有点绕,但经过下面的Demo,也许能够帮助你理解.

2:案例讲解

在项目下的build.gradle文件中添加apt插件:

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

在app目录的build.gradle文件中添加:

    provided 'javax.annotation:javax.annotation-api:1.2'
compile 'com.google.dagger:dagger:2.5'
apt 'com.google.dagger:dagger-compiler:2.5'

首先我们创建一个商品类

/***
* 这是一个商品类
*/
public class CommodityInfo { @Inject
public CommodityInfo (){ } @Override
public String toString() {
return "我是商品类对象";
}
}

我们在构造方法上面添加了一个@Inject注解,有啥用呢?

我们使用ctrl+F9(mac使用Cmd+F9)进行一次编译,编译结束后,打开文件

自动生成的代码:

@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://google.github.io/dagger"
)
public enum CommodityInfo_Factory implements Factory<CommodityInfo> {
INSTANCE; @Override
public CommodityInfo get() {
return new CommodityInfo();
} public static Factory<CommodityInfo> create() {
return INSTANCE;
}
}

创建一个Module类以及一个Component接口

@Module  //这是一个提供数据的【模块】
public class Demo1Module { private Demo1Activity demo1Activity; public Demo1Module (Demo1Activity activity){
this.demo1Activity = activity;
} }
//这是一个【组件】/注射器
@Component(modules = Demo1Module.class)
public interface Demo1Component { //这个连接器要注入的对象。这个inject标注的意思是,我后面的参数对象里面有标注为@Inject的属性,
//这个标注的属性是需要这个连接器注入进来的。
void inject(Demo1Activity demo1Activity); }

可以使用商品类对象了

public class Demo1Activity extends AppCompatActivity {

    TextView textView;

    @Inject
CommodityInfo commodityInfo; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo1_layout);
DaggerDemo1Component.builder()
//.demo1Module(new Demo1Module(this)) //可要可不要
.build().inject(this);
initView();
} private void initView(){
textView = (TextView) findViewById(R.id.textView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Demo1Activity.this,"对象值:"+commodityInfo.toString(),Toast.LENGTH_LONG).show();
textView.setText("对象值:"+commodityInfo.toString());
}
});
}
}

3:简单介绍

我们假设案例中的Activity代表家庭住址,CommodityInfo代表某个商品,现在我们需要在家(Activity)中使用商品(CommodityInfo),我们网购下单,商家(代表着案例中自动生成的CommodityInfo_Factory工厂类)将商品出厂,这时我们能够在家直接获得并使用商品吗?

当然不可能,虽然商品(CommodityInfo)已经从工厂(Factory)生产出来,但是并没有和家(Activity)建立连接,我们还需要一个新的对象将商品送货上门,这种英雄级的人物叫做——快递员(Component,注入器)。

没错,我们需要这样的一种注入器,将已经生产的Student对象传递到需要使用该Component的容器Activity中,于是我们需要在Activity中增加这样几行代码:

DaggerDemo1Component.builder().demo1Module(new Demo1Module(this)).build().inject(this);

这就说明快递员Component已经将对象Inject(注入)到了this(Activity)中了,既然快递到家,我们当然可以直接使用CommodityInfo啦!

@Inject : 注入,被注解的构造方法会自动编译生成一个Factory工厂类提供该类对象。

@Component: 注入器,类似快递员,作用是将产生的对象注入到需要对象的容器中,供容器使用。

@Module: 模块,类似快递箱子,在Component接口中通过@Component(modules =
xxxx.class),将容器需要的商品封装起来,统一交给快递员(Component),让快递员统一送到目标容器中。
效果如图:
 
            
 
 
 

android--------Dagger2介绍与简单使用(一)的更多相关文章

  1. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...

  2. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  3. android Animation介绍

    Animation介绍: 在Android SDK介绍了2种Animation模式: 1. Tween Animation:间动画,通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即 ...

  4. android AsyncTask介绍(转)

    android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ...

  5. Android monkey介绍

    Android monkey介绍 原文地址 1 简略 monkey是android下自动化测试比较重要的的一个工具,该工具可以运行在host端或者设备(模拟器或真实设备).它会向系统发送随机事件流(即 ...

  6. Android 开发框架介绍

    一.概述 现android开发有很多开发框架使用,做App不一定用到框架,但好框架的思想也是值得学习.选择合适的开发框架可提供实用功能,简化项目开发提升效率. 二.Afinal框架 简介 Afinal ...

  7. [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍

    注:为了看上去比较清晰这里只转载了中文 原地址:  [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...

  8. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  9. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  10. Android开发——Fragment的简单使用总结

    前言: 之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结 Fragment的简单介绍: 简单来说,Fragment其实可以理 ...

随机推荐

  1. Hadoop学习之路(二十四)YARN的资源调度

    YARN 1.1.YARN 概述 YARN(Yet Another Resource Negotiator) YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操 作系 ...

  2. Linux下的Make命令实例详解

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.下面这 篇文章我们将用一 ...

  3. linux常用命令:yum 命令

    用于添加/删除/更新RPM包,自动解决包的依赖问题以及系统更新升级. 1.命令格式:    yum  [参数] [软件名]2.命令功能:    功能:  yum提供了查找.安装.删除某一个.一组甚至全 ...

  4. 20145316许心远《网络对抗》MSF基础应用

    20145316许心远<网络对抗>MSF基础应用 实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:顾名思义就是攻击嘛,因为是个动词,所以 ...

  5. iOS &Android 项目 Jenkins持续集成

    背景:由于之前的jenkins机器软件环境较老(mac系统 和 Xcode版本等太低).设备性能也是比较差,编译相关脚本也不大适合目前业务,所以,跟infra部门重新申请了一台固定ip .高配的mac ...

  6. 左连接LEFT JOIN 连接自己时的查询结果测试

    #左连接LEFT JOIN 连接自己时的查询结果测试 #左连接LEFT JOIN 连接自己时的查询结果(都会出现两个重复字段),两个表都有as后只能查询相等条件merchant_shop_id非nul ...

  7. (一)MySQL登录与退出

    mysql登陆: win+r输入cmd按enter进入命令行界面: > mysql -uroot -p -P3306 -h127.0.0.1 > 输入密码后按回车 mysql退出: mys ...

  8. c++继承、多态以及与java的行为差异之处

    对于面向对象而言,多态是最有用的基本特性之一,相对于函数指针,易用得多.下面看下c++继承和多态行为的基本特性,最后说明下和java的基本差别. 首先定义父类和子类. base.h #pragma o ...

  9. # 20145106 《Java程序设计》第6周学习总结

    教材学习内容总结 来源和目的都不知道的情况下还是可以撰写程序的,有这类需求的时候,可以设计一个通用的dump()方法.dump方法接受inputstream与outputstream实例,分别代表读取 ...

  10. 20145309李昊《网络对抗技术》实验9 web安全基础实践

    本实验在同学帮助下完成 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前 ...