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. 记录--常用的linux命令

    mysql event /*查询event是否开启(查询结果Off为关闭 On为开启)*/ show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/ se ...

  2. 通过手机浏览器打开APP或者跳转到下载页面.md

    目录 通过手机浏览器打开APP或者跳转到下载页面 添加 schemes 网页设置 参考链接 通过手机浏览器打开APP或者跳转到下载页面 以下仅展示最简单的例子及关键代码 由于硬件条件有限,仅测试了 A ...

  3. finereport Web工具栏

    1.获取报表工具栏按钮 在报表页面中,偶尔会有需要获取工具栏按钮的需求,之前只能通过contentPane.toolbar.options.items[index]来获取,比较不方便,现在我们提供了两 ...

  4. pro-select-like

    DELIMITER | drop procedure if exists pro_query; CREATE PROCEDURE pro_query ( cname VARCHAR() ) BEGIN ...

  5. tomcat8以上管理页面提示403问题

    修改conf/tomcat-users.xml <role rolename="manager"/> <role rolename="manager-g ...

  6. js中window.open的参数及注意

    IE9下使用window.open时需要注意name参数值不能有"-"出现,否则会出现脚本错误,IE9以及版本测试没有问题   window.open(URL,name,specs ...

  7. 深入Redis内部-Redis 源码讲解(转)

    Redis作为 NoSQL 数据库的杰出代表,一直广受关注,其轻量级的敏捷架构,向来有存储中的瑞士军刀之称.下面推荐的一篇文章,从源码的角度讲解了Redis 的整个工作流程,是了解 Redis 流程的 ...

  8. mysql 如何找出两张表之间的关系

    分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #2.再站在右表的角度去找 是否右表的 ...

  9. 快速排序算法Java版

    网上关于快速排序的算法原理和算法实现都比较多,不过java是实现并不多,而且部分实现很难理解,和思路有点不搭调.所以整理了这篇文章.如果有不妥之处还请建议.首先先复习一些基础.    1.算法概念. ...

  10. DP专题·二

    1.hdu 1260 Tickets 题意:有k个人,售票员可以选择一个人卖,或者同时卖给相邻的两个人.问最少的售票时间. 思路:dp[i] = min(dp[i - 1] + singlep[i], ...