Dagger2学习笔记5(关于Lazy,Provide的使用)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dagger2学习笔记5(关于Lazy,Provide的使用)相关的知识,希望对你有一定的参考价值。

参考技术A Dagger2学习笔记1(基础概念学习)
Dagger2学习笔记2(学习Dagger2的简单使用)
Dagger2学习笔记3(各个注解学习)
Dagger2学习笔记4(@Singleton 与@ Scope 实现全局单例与作用域单例)

之前的学习中我们了解了Dagger2的大部分使用方法, 接下来学习Lazy, Provide的使用.

Lazy和Provide可以用来包装我们需要注入的依赖, Lazy为懒加载模式, 用到的时候才会依赖, 加载过一次之后就会只使用之前的实例, 而Provide为强制加载, 每次调用都会强制重新加载.

定义一个可以提供flower, dog和car的module, 都没有使用singleton或者scope注解

先什么都不做, 只是声明注入对象, 分别使用普通注入, Provider包装, Lazy包装. 控制台输出结果:

可以看到普通注入只要声明就会被初始化, 而使用Provider和Lazy包装的并没有进行初始化, 接下来我们分别对这些不同对象调用两次:

控制台输出:

可以看到使用Provider包装的dog, 每次调用都会重新获取新的实例, 而使用普通注入和使用Lazy包装都使用的是用一个实例, 从而也就能看出各自的区别.

以上为依赖没有使用Singlton或者Scope限定单例范围, 接下来我们限定单例, 看看结果如何, 修改Module文件:

在运行得到结果:

我们看到, 当限定局部单例之后, 无论是Provider还是Lazy, 在同一个activity中只会获取同一个依赖对象.

我们已经学习了Dagger的各种使用, 接下来会对Dagger的实现原理进行学习!
End~

dagger2 重点笔记

官方架构例子,里面有个dagger2的结合的例子

https://github.com/googlesamples/android-architecture

https://google.github.io/dagger

 

Dagger2 通过注解来生成代码,定义不同的角色,主要的注解有:@Inject、@Module 、@Component 、@Provides 、@Scope 、@SubComponent 等。

  @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
  @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
  @Provides: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
  @Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的   @Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
  @Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没必要让每个对象都去了解如何管理他们的实例。

 

简单地说,通过对象类型传递 对象以来, 通过 module和 provides 提供对象 ,component中 若要注入当前对象 提供个 inject(MainActivity )方法

对于component类 除了inject 其它方法的作用:

1.可以将A模块中(provides注解)的对象给B模块(某个函数的 形参)使用,暴露方法共用,通过component作为中间桥梁

2.component 其方法的返回值 一般来自于 依赖的模块 提供的, make project后,当生成 DaggerComponent之后可供外部调用。

3.若component中的返回类型对象A,从从子模块 的provides 提供的注解 没有找到类型一致的对象类型A时,可从A对象的构造函数查找下 应该有个@inject 从外部注入的,里面的形参 肯定可以在 子模块中找到。

4.不允许 @provides 返回的参数 与形参类型一样,这样会死循环,形参 是从 返回的参数那边找来 注入的。

以上是关于Dagger2学习笔记5(关于Lazy,Provide的使用)的主要内容,如果未能解决你的问题,请参考以下文章

Dagger2学习资源

Dagger2入门详解

scala学习笔记-过程lazy值和异常

dagger2 重点笔记

dagger2简单使用与理解笔记

dagger2简单使用与理解笔记