一个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你可以这样认为:
它是利用注解自动生成“工厂模式”的一个框架,这样就轻松多了。有理解错误的地方希望请留言斧正。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

一个demo理解什么是Dagger2

标题之所以是Dagger2是因为我没看Dagger^_^,具体Dagger2与Dagger有什么区别请百度这里不再赘述。 使用Dagger2前准备工作1.配置apt插件apt插件是用于自动生成代码的,...

一个demo理解什么是MVP

所谓MVP就是视图,控制逻辑,数据的三者的分离,但是分离后我们还需要“控制逻辑层”P操作M(数据层)或V层(视图层), 这就需要每一层都实现一个接口,以方便其他层的调用。不理解的童鞋直接看下面代码。(...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Dagger2是什么鬼

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

Java千百问_01基本概念(001)_什么是Java

点击进入_更多_Java千百问1、什么是JavaJava是一种开发语言(核心特点:跨平台,面向对象,名称由来看这里:J2EE里面的2是什么意思),对于开发者来讲,Java基本等于Jdk。Jdk的版本介...

Java中的null是个什么东西?

一、null是代表不确定的对象 Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。 比如:int a = nu...

vue.js介绍

vue.js 是一个用来开发 web 界面的前端库。它也有配套的周边工具。如果把这些东西都算在一起,那么你也可以叫它一个『前端框架』。但我个人更倾向于把它看做是一套可以灵活选择的工具组合。如果你到现在...

EJB到底是什么,真的那么神秘吗??

EJB到底是什么,真的那么神秘吗?? 分类: ejb 架构师之路 2013-12-16 17:40 7人阅读 评论(0) 收藏 举报 1. 我们不禁要...

什么是J2EE?

什么是J2EE? J2EE是一种用来开发分布式企业软件应用系统的平台。JAVA语言从创生之日起,就获得了广泛接纳,经历了巨大的发展。越来越多的技术都成了JAVA平台的一部分,为了适应不同的需要业开发吃...

两分钟让你明白什么是ERP

ERP(Enterprise Resource Planning)企业资源计划系统,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。   一天中午,丈...

Github是什么?

Github是什么?      要了解Github,我们首先要知道Git,Git是管理代码的工具,写代码不是件轻松的事儿,一个人写的时候已经不轻松了,一群人写就更不轻松了,大部分人都会和别人...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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