依赖注入Dagger2

之前在项目中要用到这个库,后来就给团队内部分享完Dagger2后做的一个提纲总结。

解决的痛点

依赖管理问题

角色

  1. 依赖实例
  2. 注入对象
  3. 注入方式

提供依赖的方式

  1. @Inject

  2. @Module 优先级更高

    @provide

注入在哪里

@Inject

注入方式:连接的桥梁

@Component

注入方法:void inject();

提供中间桥梁:Application getApplication();

依赖的实体:modules

依赖的传递:dependencies 本质是将依赖的Component的引用传递给了被依赖的Component

@SubComponent:Component的拓展

公用依赖实例

区别

Component Dependencies: 单纯依赖
  1. 你想保留独立的单个组件
  2. 要明确的显示该组件所使用的其他依赖
Subcomponent:有点类似继承
  1. 两个组件之间的关系紧密
  2. 你只关心Component,而Subcomponent只是作为Component的拓展

限定符

@Qualifier 自定义注解

区分多个依赖对象,单独为其打上标记

作用域

@Scope 自定义注解

管理依赖的生命周期

默认实现:@Singleton 局部单例

Module中provide方法使用了@scope, 对应的Component中也必须加上@scope, 注解名字也是一样的,这时候 provide提供的方法就会在Component中保持『局部单例』,如果只是在Component中标注@scope,Module中的provide方法没有标注,这时候scope就不会起作用,仅仅是为了编译通过

实现单例:

  1. 依赖在Component中是单例的(供该依赖的provide方法和对应的Component类使用同一个Scope注解。)
  2. 对应的Component在App中只初始化一次,每次注入依赖都使用这个Component对象。(在Application中创建该Component)

    自定义其他scope:@ActivityScope @FragmentScope等等

延迟注入Lazy

初始化的时候不注入,等到调用get方法的时候才去初始化依赖实例注入依赖

多实例注入Provider

有时候不仅仅是注入单个实例,我们需要多个实例,每次调用它的 get() 方法都会调用到 @Inject 构造函数创建新实例或者 Module 的 provide 方法返回新实例

分享到:
移动开发者/技术爱好者/喜欢开源与分享,你也可以关注微信公众号MobDevGroup,移动开发在线分享:MobDevGroup