Dagger2 中虽然概念挺多的,但是大部分花时间都能理清。包括看人家的分析,Debug 代码下去也能懂。但是对于 scope 的用法以及实现原理还是有点难理解的。主要的问题也像简书上的文章所说:

  自定义注解是怎么工作的?是不是命名了就能达到自己想要达到能够控制自己所提供的组建的生命周期的生命周期的功能?引用的说法就是这么一个回事:

  比如Singleton就可以实现单例,PerActivity就可以创建的类实例与Activity“共生死“,是不是我定义一个PerFragment的注解,同样可以达到创建的类实例就与Fragment“共生死“。

  Singleton 是 scope 的默认实现。也就是说 Singleton 是 scope 的一个表现形式,系统已经给我们提供了。那么为什么需要这样一个 Singleton 呢?以及这个 SingleTon 是怎么实现出来的。

  对于后面说的一点,看过很多文章去尝试理解。

  一个 app 要有一个全局的 Component(我们暂且叫ApplicationComponent),ApplicationComponent 负责管理整个 app 用到的全局类实例,那不可否认的是这些全局类实例应该都是单例的。

  就有人说:Singleton 并没有创建单例的能力。不是说你用 Singleton 修饰了某个实例,它在全局范围内就是单例的了。真正用创建 Singleton 的过程步骤为:

  在 Module 中定义创建全局类实例的方法

  ApplicationComponent 管理 Module

  保证 ApplicationComponent 只有一个实例(在 app 的 Application 中实例化 ApplicationComponent )

  所以讲 Singleton 并没有创建单例的能力,进而引申出并不是用 Scope 修饰的实例就有一定的生命周期的控制等等概念。

  看到一篇文章底下的评论如是说:

  用MyScope 标注的 Component,如果 Moudle 中的 provide 也被MyScope标注,那么在这个Component的生命周期内 ,这个 provide提供的对象是单例的。

  这样一看,仔细想一下也是能够理解的。更多的时候我们的 scope 以及 Singleton 只是一个标识符而已。

  最后牛晓伟的那篇文章最后一些还是没明白:

  更好的管理 Component 之间的组织方式,不管是依赖方式还是包含方式,都有必要用自定义的Scope 注解标注这些 Component,这些注解最好不要一样了,不一样是为了能更好的体现出Component 之间的组织方式。还有编译器检查有依赖关系或包含关系的 Component,若发现有Component 没有用自定义 Scope 注解标注,则会报错。

  更好的管理 Component 与 Module 之间的匹配关系,编译器会检查 Component 管理的 Modules,若发现标注 Component 的自定义 Scope 注解与 Modules 中的标注创建类实例方法的注解不一样,就会报错。

  可读性提高,如用 Singleton 标注全局类,这样让程序猿立马就能明白这类是全局单例类。

  特别对于第一点还是不太明白。记录下来以后还是实践中多总结吧

Dagger2 中的 Scope的更多相关文章

  1. 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

    1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一 ...

  2. 理解vue中的scope的使用

    理解vue中的scope的使用 我们都知道vue slot插槽可以传递任何属性或html元素,但是在调用组件的页面中我们可以使用 template scope="props"来获取 ...

  3. MAVEN中的Scope

    Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用6个值: *im ...

  4. Maven依赖中的scope详解

    scope的分类 compile 默认就是compile,什么都不配置也就是意味着compile.compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的 ...

  5. Maven依赖中的scope详解,在eclipse里面用maven install可以编程成功,到服务器上用命令执行报VM crash错误

    Maven依赖中的scope详解 项目中用了<scope>test</scope>在eclipse里面用maven install可以编译成功,到服务器上用命令执行报VM cr ...

  6. angularjs指令中的scope

    共享 scope 使用共享 scope 的时候,可以直接从父 scope 中共享属性.因此下面示例可以将那么属性的值输出出来.使用的是父 scope 中定义的值. js代码: app.controll ...

  7. angularjs 中的scope继承关系——(2)

    转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include ...

  8. spring中的scope详解

    spring容器中的bean默认是单例模式的,改成非单例模式需要在类上加上@Scope("prototype") 1. scope概论 spring中scope是一个非常关键的概念 ...

  9. HTML表格中<td scope="col">与<td scope="row">的含义

    HTML表格中<td scope="col">与<td scope="row">的含义 表格中 <td scope="c ...

随机推荐

  1. screen命令在freebsd安装和使用

    安装 # cd /usr/ports/sysutils/screen # make install clean 使用 # screen //以下^A表示同按“Ctrl + A”键 # ^A c //C ...

  2. java反射——构造方法

    大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...

  3. Oracle Schema Objects——Tables——Overview of Tables

    Oracle Schema Objects Overview of Tables A table is the basic unit of data organization in an Oracle ...

  4. test-event-create

    # 1 创建存储过程 /* delimiter // create procedure test() begin update test SET name = date_format(now(),'% ...

  5. Numpy常用操作方法

    NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准数学函数(无需编 ...

  6. Python变量和基本数据类型

    1.变量 a .什么是变量 变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态. b.为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能 ...

  7. 【我的Android进阶之旅】解决MediaPlayer播放音乐的时候报错: Should have subtitle controller already set

    一错误描述 二错误解决 解决方法一 解决方法二 一.错误描述 刚用MediaPlayer播放Music的时候,看到Log打印台总是会打印一条错误日志,MediaPlayer: Should have ...

  8. docker的安装以及jdk和tomcat的环境配置

    准备工作:需要Linux kernel 3.8支持查看linux内核的版本:root@ubuntu-dev:~# cat /proc/version查看linux版本:root@ubuntu-dev: ...

  9. Android Studio 启动时不自动打开项目

    主界面中,选择单击菜单栏 File ,单击 Settings 选择 Appearance & Behavior 选项.选择System Settings选项.取消勾选Reopen last p ...

  10. VIM 配置python

    Pre-install sudo yum install automake gcc gcc-c++ kernel-devel cmake sudo yum install python-devel p ...