Dagger2 中的 Scope

  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 标注全局类,这样让程序猿立马就能明白这类是全局单例类。

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

?

原文地址:https://www.cnblogs.com/qfjavabd/p/10384543.html

时间: 2024-10-30 02:54:30

Dagger2 中的 Scope的相关文章

spring中的scope详解

0.思维导图 1. scope概论 spring中scope是一个非常关键的概念,简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式. 2. scope历史及分类 目前,scope的取值有5种取值: 在Spring 2.0之前,有singleton和prototype两种: 在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们

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

转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include 假设在我们的 controller 中, $scope.myPrimitive = 50; $scope.myObject = {aNumber: 11}; HTML 为: <script type="text/ng-template" id="/tpl1.html&quo

在angular的自定义回调中操作$scope

在angular的controller中有时候会使用到自定义的回调, 比如异步请求的回调函数 一般返回之后都需要更新页面的数据,即更新$scope.xx 但是如果直接 $scope.xx = data.info 这样根本不会有任何的影响 解决方案 this.callback = function (status) { $scope.$apply(function () { $scope.xx = status; }); }; Scope提供$watch方法监视Model的变化. Scope提供$

[AngularJS] 理解AngularJS Directive中的Scope

默认情况下, AngluarJS不会为在一个Controller下的Directive创建一个单独的作用域(Scope). 这个Directive中的所有关于$scope的变量都是在它的Controller中定义, 并且会被其他的在同一Controller中的Directive所共享, 例如以下代码: <script> (function(angular) { angular.module('zzIsolateScopeTest', []) .directive("directive

如何在QML应用中启动Scope

在这篇文章中,我们将介绍如何在QML应用中调用Scope,并把搜索的关键词传进去.这对有些QML应用需要用到Scope的情况非常有用.更多关于url-dispatcher的知识,请在文章"使用URL dispatcher的范例"看到. Scope ID 首先我们来讲一下什么是Scope ID.我们打开我们创建的任何一个Scope的manifest.json文件: { "architecture": "@[email protected]", &q

angulajs 详解 directive 中 的 scope 概念

Directive 是 angularjs 中最重要的概念,我的理解就是自定义html tag, 这个自定的tag 浏览器不会解析,会有angularjs 来动态解析. 比如在html 中添加 <myPannel title="title" description="pannel description"></mypanel>, 这个myPannel tag 浏览器显然不认识,这个其实就是一个 directive. 这个directive 我

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

1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一些贯穿整个EAR都会用到的常量定义.通用的服务组件.类似DBConnection连接创建等比较消耗资源的组件等等放到这个Scope中去.Application级Scope是与应用程序的ServletContext共存亡的,因此可以理解为所部署应用程序的ServletContext中的“单例Scope

Maven依赖中的scope详解

原文链接:https://blog.csdn.net/kimylrong/article/details/50353161 原创kimy 发布于2015-12-18 17:36:48 阅读数 109197 收藏展开 Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了.今天梳理一下maven的scope. scope的分类compile默认就是com

关于maven依赖中的&lt;scope&gt;provided&lt;/scope&gt;使用

今天开发web的时候,需要用到servlet-api,于是在pom.xml中添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> </dependency> 通过插件启动tomcat的时候,报错,里面有一段是这样的: Caused