依赖注入Dagger2
之前在项目中要用到这个库,后来就给团队内部分享完Dagger2后做的一个提纲总结。
解决的痛点
依赖管理问题
角色
- 依赖实例
- 注入对象
- 注入方式
提供依赖的方式
@Inject
@Module 优先级更高
@provide
注入在哪里
@Inject
注入方式:连接的桥梁
@Component
注入方法:void inject();
提供中间桥梁:Application getApplication();
依赖的实体:modules
依赖的传递:dependencies 本质是将依赖的Component的引用传递给了被依赖的Component
@SubComponent:Component的拓展
公用依赖实例
区别
Component Dependencies: 单纯依赖
- 你想保留独立的单个组件
- 要明确的显示该组件所使用的其他依赖
Subcomponent:有点类似继承
- 两个组件之间的关系紧密
- 你只关心Component,而Subcomponent只是作为Component的拓展
限定符
@Qualifier 自定义注解
区分多个依赖对象,单独为其打上标记
作用域
@Scope 自定义注解
管理依赖的生命周期
默认实现:@Singleton 局部单例
Module中provide方法使用了@scope, 对应的Component中也必须加上@scope, 注解名字也是一样的,这时候 provide提供的方法就会在Component中保持『局部单例』,如果只是在Component中标注@scope,Module中的provide方法没有标注,这时候scope就不会起作用,仅仅是为了编译通过
实现单例:
- 依赖在Component中是单例的(供该依赖的provide方法和对应的Component类使用同一个Scope注解。)
- 对应的Component在App中只初始化一次,每次注入依赖都使用这个Component对象。(在Application中创建该Component)
自定义其他scope:@ActivityScope @FragmentScope等等
延迟注入Lazy
初始化的时候不注入,等到调用get方法的时候才去初始化依赖实例注入依赖
多实例注入Provider
有时候不仅仅是注入单个实例,我们需要多个实例,每次调用它的 get() 方法都会调用到 @Inject 构造函数
创建新实例或者 Module 的 provide 方法返回新实例