Dagger2图文完全教程

Dagger2图文完全教程



本文属代码GG原创,非经本人同意,禁止转载。

github地址:https://github.com/luxiaoming/dagger2Demo

需要交流,联系微信:code_gg_boy

更多精彩,时时关注微信公众号code_gg_home

没有更多开场白,直接说下我对它的理解。

Dagger2 是一个Android依赖注入框架。而android开发当前非常流行的非MVP模式莫属了,Dagger2的目标便是将MVP中的V P 进一步解耦,达到模块化最大的解耦,使得代码更容易维护。

举个栗子:有个A对象 B对象 和C对象,如果C对象创建需要A和B,那么我们是不是需要构造里面传入参数A和参数B,然后在使用的地方如下写个代码:

C c=new C(new A(),new B());

如果我们使用了Dagger2时候,我们就不需要管这些了,只需要关联住能提供创建A 和 B的地方 ,然后在需要C的地方写下:

@Inject
C c;

然后在这个类的初始化地方进行注入即可。

我们初步来看,会发现Dagger2优势不大,没什么吸引人的,那么请你静下心来,看完再得出结论。



闲话休叙,我们来直接上代码:(常规写法)

1 编写一个类:

public class Test3 {
    public Test3() {
    }
}

2 使用的地方

public class MainActivity extends AppCompatActivity {
    Test3 test3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //.....
        test3 = new Test3();
    }
}

  • 如果我们改为使用Dagger2的方式的话,则可以写成如下方式:

1 创建一个类

使用了注解方式,使得Dagger2能找到它。

public class Test3 {
    //这里可以看到加入了注解方式
    @Inject
    public Test3() {
    }
}

2 新增一个对象:

@Singleton
//用这个标注标识是一个连接器
@Component()
public interface MainActivityComponent {
    //这个连接器要注入的对象。这个inject标注的意思是,我后面的参数对象里面有标注为@Inject的属性,这个标注的属性是需要这个连接器注入进来的。
    void inject(MainActivity activity);
}

3 调用的地方改为:

public class MainActivity extends AppCompatActivity {
    //加入注解,标注这个test3是需要注入的
    @Inject
    Test3 test3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用组件进行构造,注入
        DaggerMainActivityComponent.builder().build().inject(this);
    }


这是最简单的一种使用了。首先我们看到,第一印象是我去,这个更复杂了啊。我只能说确实,因为这个是它对的最基础的使用,看起来很笨拙,但是当它在大型项目里面,在依赖更多的情况下,则会发生质的飞跃,会发现它非常好用,并且将你需要传递的参数都隐藏掉,来实现解耦。



我先说下Dagger2的注释思路:关键的点是@Component,这个是个连接器,用来连接提供方和使用方的,所以它是桥梁。它使用在组件里面标记使用的Module(标记用到了哪个Module,主要是看使用方需要哪些对象进行构造,然后将它的提供方@module写在这里) 然后我们写入一个void inject(MainActivity activity); 这里后面的参数,就是我们的使用方了。如此一来,我们在使用的地方,使用类似这种方式(DaggerMainActivityComponent.builder().build().inject(this);)的动作,将使用方类里面的标记 为@Inject的类初始化掉,完成自动初始化的动作。

结构如下:

为了更好的来学习它,我们来依次看看各种使用情况。

1 常规使用方法

直接感受下,如何?

2 带一个参数的效果









我们来看一个代码段,当我们创建两个实例的时候,发现地址是独立的。

如果我们想要一样的地址呢?加上一句话,具体如下:

效果便是两个共用实例啦。

3 换种经常使用的方式

将提供的构造,放入@module里面,具体效果如下:

去掉标记的@singleton后

效果变成独立的啦

4 依赖一个组件的时候

有时我们需要依赖一个组件,这个最常见的用法是,我们App实例里面提供了比如获取sharepreference的实例,和比如现在代码里面的LocationManager的实例,我们Activity里面需要这些实例,我们该如何来做呢?看效果:

1:一个AndroidModule 模块标记

这个模块属于AndroidcationComponent 组件里面

这里有个关键点,就是子组件需要这个里面的某个实例的时候,这里需要使用一个接口,将需要的实例做一个返回动作。这里是LocationManager这一行。

我们的子组件的代码如下:

对应的Cmodule代码如下:

再来看下Test3的代码当前情况:

使用的地方:



细心的你会发现这里多了一个注释了,@PerActivity,它是个什么鬼呢?

这里我们看到它是使用了@Scope的一个注释,这个注释的意思就是作用域,在作用域内保持单例,可以直接理解为单例即可。

为什么要新增一个呢,主要是因为各个组件需要独立出来,因此如果是依赖关系,则需要各自在不同的注释作用域里面。

我们来看下在Cmodule里面,加上@perActivity注释后的效果:

如果去掉呢?

我们突然发现,它和单例的注释起的作用一样啊。so。。。是不是发现什么啦。

因此我们得出一个结论,这里@Singleton

就是一个普通的作用域通道,使用了作用域@Scope注释的代码,会变成单例模式。为了验证我们的思路,作如下测试:

我们将之前的@Singleton用新建的这个替换掉,验证两次的生成代码,发现一模一样,一模一样,一模一样,so。。。 就是这个样子啦。

5 自定义一个标记

为什么要自定义标记呢?这个标记不是使用@Scope注释的哦,是使用@Qualifier 标记的,它的目标是,为了区分如果同时返回类型一样,比如构造男孩,女孩的基本属性,性别和名字时候,获取男孩和女孩都是一个对象,我们该如何区分呢,这个就是关键啦。说这么多,真心很烦,直接栗子来啦。

这里稍安勿躁,先来看相同效果的另一个注释,@Name,这个是Dagger2自带的一个让区分,效果如下:

这里@Name可以简单的一个使用方式,就是它不是区分对象,而是限制使用时候必须加入这个注释,否则报错,目的就是让使用者注意是否使用正确了。

我们使用自己的注释再来一遍:

对比两种方式,我们发现使用@Name的时候,后面的注释名字会敲错,而我们第二种方式呢,则不会耶,so。。。

我们看下自定义的标记,作为限制出错,让强制标注的例子。

6 子组件(公共组件)

这个出现的目的是为了如果有一个组件,是每次创建实例提供给别人,而恰好其他组件(有多个)里面有需要它,如果只有一个,我们就用依赖搞定啦。那么它就可以定义成子组件,谁需要在谁的组件里面加一下,具体看例子:

如上,写完啦。。

实战地方,可以参照 https://github.com/gzsll/TLint 来阅读啦,收工。

需要交流,联系微信:code_gg_boy

更多精彩,时时关注微信公众号code_gg_home

时间: 2024-11-05 19:43:00

Dagger2图文完全教程的相关文章

MyEclipse 2014 破解图文详细教程

MyEclipse 2014 破解图文详细教程 原文地址:http://blog.my-eclipse.cn/myeclipse-2014-crack.html MyEclipse2014 Windows版下载地址:http://pan.baidu.com/s/10VoL4 MyEclipse作为Java EE最受欢迎的IDE,如今最新版本为2014版,今天给大家带来MyEclipse 2014破解的方法. 一.安装完成MyEclipse2014(适用于2013等版本)后,不要打开软件,下载破解

Ubuntu 16.04安装QQ国际版图文详细教程

      因工作需要,我安装了Ubuntu 16.04,但是工作上的很多事情需要QQ联系,然而在Ubuntu上的WebQQ很是不好用,于是在网上搜索了好多个Linux版本的QQ,然而不是功能不全,就是界面丑到爆,要么就是不稳定:最后,找到了个人认为最好用的QQ-WineQQ国际版. 说明:一开始,我在Ubuntu 16.04下安装的QQ版本是Wineqq2013SP6-20140102-Longene,但后来发现这个版本QQ在linux下问题很多,比如不能 用键盘输入密码,QQ表情使用失灵,有

mysql安装图解 mysql图文安装教程(详细说明)

整理的一篇mysql的安装教程,步骤明细也有详细的说明. MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本. mysql 下载地址 http://www.jb51.net/softs/2193.html 下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下!打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行"setup.exe",出现如下界面 mysql安装图文教程1 mysql安装向导启

CentOS 6.4 图文安装教程

1.首先,要有一张CentOS 6.4的安装介质,使用介质启动电脑出现如下界面 界面说明: Install or upgrade an existing system 安装或升级现有的系统 install system with basic video driver 安装过程中采用基本的显卡驱动 Rescue installed system 进入系统修复模式 Boot from local drive   退出安装从硬盘启动 Memory test  内存检测 注:用联想E49安装时选择第一项

CentOS7图文安装教程

CentOS 7下载: CentOS 7只提供64位版本,虽然有不少国内镜像节点,不过还是觉得通过BT下载是不错的选择.镜像大小6.7G,联通20M光纤下载,不到小时.以下是中国大陆的下载地址列表: http://mirrors.hust.edu.cn/centos/7.0.1406/isos/x86_64/ http://mirrors.aliyun.com/centos/7.0.1406/isos/x86_64/ http://mirrors.yun-idc.com/centos/7.0.1

微信开发 BAE运平台和java语音,微信mysql数据库开发实例 --图文开发教程

持续更新中 BAE java开发mysql数据库 图文教程 BAE java语言开发mysql源代码下载: 目前微信开发.BAE开发.java开发.mysql开发的教程很多,但是没有一个详细的介绍基于BAE平台.java语言和mysql数据库的微信开发教程.所以写了该教程,希望能给大家一点启发. 教程分为: 1.申请BAE账户: 2.在BAE平台建立web服务器应用: 3.在BAE平台建立mysql数据库服务器应用: 4.使用eclipse开发基于BAE平台的处理微信消息的web服务器系统: 5

AVS视频剪辑软件图文使用教程

AVS Video Editor集视频录制.编辑.特效.覆叠.字幕.音频与输出于一体,实为简约而不简单的非线性编辑软件,几步简单的拖放操作即可制作专业外观的视频,另外AVS Video Editor的视频输出功能也异常强大,支持完全的自定义输出设置. 一.软件下载安装 软件名称 AVS Video Edito 视频剪辑软件 软件大小 89 MB 下载地址 视频剪辑工具下载 二.软件使用教程 1).编辑图片素材: 返回到素材列表中双击“Image”图标按钮即可进入图片素材列表,也可以单击素材列表后

2015最新iherb海淘攻略-图文入门教程

IHerb是美国最热门的海淘海购网站之中的一个,适合不爱担心,怕麻烦的朋友入门海淘,由于它有中文页面,可直邮中国,上千个母婴用品.化妆品.保健品品牌,最重要的是!首次下单,价值$40及以上的订单会马上节省$10,$40下面订单,能够享受$5.(结账的时候填写此优惠代码:PDD201 就可以,该优惠码长期有效). 一.IHerb简单介绍 IHerb自1994年成立以来向世界各地输送天然保健品,如今已经拥有600多个著名品牌(眼下共同拥有超过1500个品牌),3万多种高级保健品,化妆品及个人用品.在

mysql安装图解 mysql图文安装教程(详细说明)-[转]

很多朋友刚开始接触mysql数据库服务器,下面是网友整理的一篇mysql的安装教程,步骤明细也有详细的说明. MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本. mysql 下载地址 http://www.jb51.net/softs/2193.html 下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下!打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面 my