Dagger 注解介绍

@Inject :

这个注解有两种使用方式,一种是注解类的构造函数,一种是注解类的成员变量。

先说下第一种,在类的构造函数上注解的作用是为了创建一个当前类的工厂类。

第二种,在类的成员变量上注解是为了创建一个当前类的成员注入对象。

@Inject 注解的两个功能基本上已经明确了,一是 为了提供被注入的对象,二是提供注入到当前类的对象。

@Provides

这个注解使用起来比较简单,主要的作用是为了弥补@Inject注解的不足,因为@Inject在提供注入对象的时候必须要在构造函数上注解,那么这就存在局限。@Provides就是为了弥补这种局限的。

可以看到构造函数中需要所在的Module 对象,下面再说说这个module。

@Provides 注解的功能就是标注提供被注入的对象的方法,是为了弥补@Inject 注解出现的。

@Module

@Module注解在我看来就是提供一个场所,用来生成被注入的对象的场所,由上文可以知道我们可以用过两种方式提供被注入的对象,@Inject 标识构造函数,@Provides 标识提供注入对象的方法。但是如果在整个项目中任意位置这么写的话,我想这个工作量可能会很巨大,所以就出现了Module注解,一是为了整理归拢当前需要的提供的注入对象,二是便于维护,当前module内的可以互相提供。

提问:
不同module ,相同component中的是否可以互相提供? 这个都等Component之后在回答。

通过@Module 标记的类不会生成新的代码。

@Component

现在我们来整理一下我们目前有的东西,

一个是通过@Inject注解构造函数的被注入对象提供工具。
一个是通过@Provides注解的被注入对象的方法工具。
一个是提供注入对象的场所。
一个是通过@Inject注解成员变量的当前类的注入对象工具

那么我们现在缺少一个东西,来讲提供的对象注入的指定的类中,那就是@Component, 它可以知道它能从哪些地方来获取被注入的对象,它有一个方法能够调用当前类的注入工具去注入对象。更具体的说它的作用是将提供注入对象的场所和要去注入的类建立连接。

可以看到它通过Builder对象进行初始化,初始化的时候会需要一个Module , 不过已经被标记为废弃了,之后会给它的成员变量赋值。成员变量时注入接口的泛型对象,泛型类型就是在写inject方法的时候的参数类型,这个成员变量会通过之前的@Inject 方法标注的成员变量编译出来的注入工具生成。通过创建的时候也需要一个Proivder<T>泛型对象,这里直接就是通过@Inject 注解的构造函数编译出来的工具生成。

接下来看看两个对象的情况:

我们只关注改变,只有成员注入工具类和连接Component 发生改变

第一个发生变化的是注入工具的构造函数变成了两个参数,并且注入的函数变成了三个。这些是注入工具的改变.。

这里看到主要有两个变化,按照调用顺序来分析。

首先在生成Builder的时候现在必须会持有一个UserModule 了,之前的时候是没有的。

其次是在initialize的时候,会先通过Builder的Moudle去生成一个通过@Provides 注解的注入工具类,然后把这个生成的工具类和之前的Inject生成的工具类一起给Activity的注入工具类。

回答之前的问题:
答案是可以的,在同一个Component 下的module中的代码是可以互相依赖的。

下面说一下为什么?

我只取了比较重要的的地方,可以看到,之前的时候在类成员注入工具在使用的时候必须有两个注入对象的提供类,并且全是泛型的接口对象,这就有很大的优势。之前提供的是userModule, 现在的则是persionmodule, 而实现改变的方式就是在Builder中,看来Builder中会持有所有的拥有provides注解的module 成员。这就是为了在注入的时候能够通过对应module生成注入对象提供工具。这一个简单的注入实现就完成。之后的更多的注解,包括@scope ,@subcomponent,等都是提供更多的变化, 基本的逻辑是不会改变的。

@Singleton

Dagger提供的@scope注解注解的一种,简单来说就是单例。但是说一下具体的要求或者说功能:

1. 亲测不能放在@Inject注解的构造函数上
2. 提供一定范围内的一个对象的唯一性。
3. 单例的范围是根Component。

这里有一个点需要说一下,不要把@Scope 想的特别神话,我最开始的时候就搞不懂这个限制是如何实现的。不过只要明白两个点就可以,一是什么对象是单例的?二是单例的范围是什么?

那么回答一下,

被@singleton 标记的@Provides方法的返回值是单例的。

单例的范围是@Singletonb标记的Component ,这里涉及到一个subcomponent的事情之后再说,接下来看一下如何实现的:

重点应该能看出来在DoubleCheck.provider();

这里是具体的实现,这里通过包装类的形式,来判断的,感觉这个地方是用来控制线程的??

因为通过测试来看,只有同一个的 Componet注入的对象才是单例的,但是这就有一个问题,其实在inject之前的,所有的初始化动作其实就都已经完成, 注入的时候实际上是调用注入工具的方法来从提供注入对象的工具中来取的,那么其实实际上的单例过程应该是在从提供注入对象工具中取对象的过程。

所以这里才是确定单例的地方,默认的时候result就是UN, 之后是枷锁,赋值,返回,这就实现了对象的单例。

那么之后就有一个问题,我们在自定义Scope的时候,真正要实现的是什么?

其实我们通过自定义的Scope所实现的根本其实就是在指定范围内的单例,跟其他任何因素都没有关系,没有生命周期之类。Scope 代表的就是单例。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容