一个demo理解什么是Dagger2

原创 2016年05月31日 22:04:29
标题之所以是Dagger2是因为我没看Dagger^_^,具体Dagger2与Dagger有什么区别请百度这里不再赘述。

使用Dagger2前准备工作

1.配置apt插件

apt插件是用于自动生成代码的,因为Dagger2放弃了反射的方式,而是选择在编译项目时根据注解自动生成相应代码,以提高app性能。
即:在编译项目过程中,apt插件根据注解自动生成实际运行的代码。

1.配置apt插件(在build.gradle(Project:xxx)中添加如下代码)

dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        // 添加apt插件
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }

2.添加依赖(在build.gradle(Module:app)中添加如下代码)

  apply plugin: 'com.android.application'
  //添加如下代码,应用apt插件
  apply plugin: 'com.neenbedankt.android-apt'

2.添加Dagger2相关库

添加依赖(在build.gradle(Module:app)中添加如下代码)
 dependencies {
      ...
      compile 'com.google.dagger:dagger:2.4'
      apt 'com.google.dagger:dagger-compiler:2.4'
      //java注解
      compile 'org.glassfish:javax.annotation:10.0-b28'
      ...
  }
这样准备工作就做完了,下面就一生产假酒的demo,来理解究竟什么是“依赖注入”。

Demo

1.demo的整体结构

这里写图片描述

2.代码

Wine
// 生成假酒也是需要酒的,这里决定真酒所占的比重
public class Wine {
    private int num = 0 ;
    Wine(){
        // 一点真酒都没有
    }
    Wine(int num){
        this.num = num ;
    }
    public String getWineInfo(){
        return "添加"+ num + "份酒" ;
    }
}
Water 
// 这个就是假酒中水的比例了
public class Water {
    private int num ;
    Water(){
        // 没添水,良心企业
    }
    Water(int num){
        this.num = num ;
    }
    public String getWater(){
        return"添加"+ num + "份水";
    }
}
FakeWine 
// 假酒类,这里就是假酒喽
public class FakeWine {

    private final Water water;
    private final Wine wine ;

    // @Inject 用于表明这里需要注入。注意:这里的Wine 和 Water 都是靠注入获得的,并没有直接实例化。
    @Inject
    FakeWine(Wine wine , Water water){
        this.wine = wine;
        this.water = water ;
    }

    public String getFakeWineInfo(){
        return wine.getWineInfo() + ","  + water.getWater() ;
    }

}
既然有需要注入的地方,就要为他提供用于被注入的内容,Dagger2中被注入的内容称之为module,如下:

WaterModule
// @Module表明这个类可用与提供注入内容
@Module
public class WaterModule {

    // @Provides 表示具体提供的内容,这里是Water ,Water 的实例化也是在这里,这样FakeWine 就不用关心Water 的具体实现了。
    @Provides
    Water provideWater(){
        // 这里的方法名没有严格要求
        return new Water(7) ;
    }
}
WineModule
// 同上
@Module
public class WineModule {

    @Provides
    Wine provideWine(){
        return new Wine(3) ;
    }
}
现在需要注解的点和提供用于注解的内容都有了,但是还不能确定生产什么样的酒(兑水比例不同,就有多个WaterModule 或 WineModule),
所以需要我们将需要将@Inject 和 @Module关联起来,代码如下:

CreateFakeWine 
// 生成假酒的具体类
public class CreateFakeWine {
    // @Component 用于将module和inject关联起来
    @Component(modules = {WineModule.class , WaterModule.class})
    interface GetFakeWine{
        FakeWine make() ;
    }

    // 这样假酒就生成出来了,具体兑多少水和真酒,在module中修改,无需修改其他地方
    public static void main(String args[]){
        System.out.println(DaggerCreateFakeWine_GetFakeWine.builder().build().make().getFakeWineInfo());
    }
}

总结

上面的代码仅是最简单的“依赖注入”的示范,并未对Dagger2进行深入讲解,好处是能快速理解什么是“依赖注入”;其他Dagger2规范,有空再贴。
“依赖注入”究竟是怎么实现的,你可以看apt生成的代码,有没有“工厂模式”的既视感^_^。所及对Dagger2你可以这样认为:
它是利用注解自动生成“工厂模式”的一个框架,这样就轻松多了。有理解错误的地方希望请留言斧正。
版权声明:本文为博主原创文章,未经博主允许不得转载。

一步一步带你写一个dagger2的Demo

1.MVP模式简介 我们的目标是实现MVP模式来开发我们的应用,那首先得知道什么是MVP模式。下面这篇文章讲述得通俗易懂,非常适合新手学习。MVP模式简单易懂介绍 这里简单讲一下, M ----  m...
  • javine
  • javine
  • 2016年10月11日 16:59
  • 2024

一些关于dagger2的理解(二)

为什么要使用dagger2:首先的答案应该是解耦,可是它怎么就解耦了呢?再往直白了说:就是少几个new。         如果这个时候问:为什么解耦或者为什么需要少几个new,我只能说换频道吧,对不...
  • shareye1992
  • shareye1992
  • 2016年05月17日 14:14
  • 1759

利用Dagger2构建的简易MVP框架

简介本文使用dagger2构建MVP框架,目的是加深dagger2的理解,一个小demo,记录分享之。 相关文章: Android Mvp实践 Android中利用泛型简化MVP总体框架工程目录...
  • yaodong379
  • yaodong379
  • 2017年03月11日 11:04
  • 1217

dagger2框架在测试中的应用

既然前文提到依赖注入使得程序易于测试,那么使用了dagger2框架的程序怎么进行测试?怎么测试,具体来讲有很多问题,尤其安卓下的测试。这里主要介绍一下和dagger2框架相关的一些东西。 ...
  • nanyi545
  • nanyi545
  • 2016年04月04日 18:09
  • 643

Dagger2图文完全教程

Dagger2图文完全教程本文属代码GG原创,非经本人同意,禁止转载。 github地址:https://github.com/luxiaoming/dagger2Demo 需要交流,联系微信:c...
  • a332324956
  • a332324956
  • 2016年06月28日 10:24
  • 3446

【Android 进阶】Dagger2 系列:入门案例一

欢迎关注我的微信公众号,不只是原创技术分享,更多的是生活的思考和总结。介绍 A fast dependency injector for Android and Java. 一个在 Andr...
  • leaf_130
  • leaf_130
  • 2017年05月09日 22:40
  • 1175

Dagger2的使用总结

Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护的然后现在把这堆东西扔给Google维护了。Dagger解决了基于反射带来的开...
  • chenrushui
  • chenrushui
  • 2017年05月08日 17:48
  • 5092

Dagger2实现依赖注入之一步一步带你入门

一、首先你要知道什么是依赖? 想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。这里给大家举个通俗易懂的例子,让你秒懂什么是依赖,你今天去办港澳通行证,出入境告诉...
  • Interface_l
  • Interface_l
  • 2017年04月10日 14:21
  • 570

“一盘沙拉”带你入门Dagger2(六)之Component依赖

如果我们有一套做好的煎饼果子(一套齐全的依赖体系,Module、Component),另外一个类需要这套依赖体系的一个对象作为依赖,怎么办,还需要再为这个对象,建立一套新的Module和Compone...
  • Android_Study_OK
  • Android_Study_OK
  • 2016年09月05日 15:12
  • 3430

解锁Dagger2使用姿势(一)

四个基本注解:@Inject(两个作用,一个是标记在构造方法上让Dagger来使用,另一个是标记在需要依赖的变量上让Dagger2为其提供依赖)@Provides(注解方法,该注解只可以在@Modul...
  • u012702547
  • u012702547
  • 2016年08月14日 22:25
  • 3632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个demo理解什么是Dagger2
举报原因:
原因补充:

(最多只允许输入30个字)