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的使用)的主要内容,如果未能解决你的问题,请参考以下文章