思考后的结晶:Dagger2 的Scope

Dagger2管理对象的方式

从Component 开始

  1. 添加有@Scope 的说明是单例
  2. 否则每次注入都会重新获取
    • new Object()
    • 调用module 里面的方法
  3. Dagger2 是使用Component 来管理对象的,Component 对象属于开发者自己维护
//例如我们会这样获取一个Component
UiComponent component = DaggerUiComponent.builder()
    .appComponent(getAppComponent()).build()

问题解答

问题1:使用两个以上Scope 报错

@Singleton
@UserScope
@Component(modules = AppModule.class)
public interface AppComponent {

}

↓

Component was annotated with more than one @Scope annotation

解答:

  1. 不管是@Singleton 还是自定义的@UserScope,本质都是@Scope
  2. @Scope的Target是ANNOTATION_TYPE,所以只能用来定义注解,否则压根就没有自定义注解的事
  3. 本质一样,所以定义两个别名的@Scope用到一起就没有意义了

问题2:@Singleton @UserScope @ActivityScope @AppScope 有什么区别

解答:

  1. Dagger2 只有Scope,其他都是Scope的别名,只是为了编程的时候清晰自己在写什么。
  2. Dagger2 是使用Component 来管理注入对象的

单例场景@Singleton

  1. 自己保证使用的是同一个Component,之后使用这个Component来注入对象
  2. 我们会在Application 创建的时候初始化好AppComponent,这样再以后注入对象的时候使用这个AppComponent 才能保证对象是单例的
  3. 如果你傻乎乎的,再次创建AppComponent 来注入,那么对不起,你这个已经不是单例了

UserScope 场景

  1. 自己保证用户登录的时候初始化UserComponent
  2. 注入的时候使用这个UserComponent注入
  3. 用户退出的时候把UserComponent 销毁掉

作用

  1. 对象的使用范围
  2. 对象的生命周期
  3. 对象的创建与销毁
  4. 对象什么时候创建,什么时候销毁的定义

Dagger2 提供的Scope

  1. @Singleton 单例

常用的Scope

  1. @ApplicationScope 注解的Component类与Application对象的生命周期一致
  2. @ActivityScope注解的Component类与Activity的生命周期一致
  3. @UserScope - 用于与当前用户联系起来的类实例的scope(在真实的app中可以是当前登录的用户)

场景重现

我们定义了三个Component:AppComponent、UiComponent、UserComponent

在Application 创建的时候创建AppComponent,这个AppComponent 一直保存着

在Activity 创建的时候创建UiComponent,这个UiComponent 的生命周期与Activity 生命周期绑定

在User 登录的时候创建UserComponent,这个UserComponent 在用户退出的时候销毁

理解一点

Component 与 Scope 与 Module 与 Object 一致的

你可能感兴趣的:(思考后的结晶:Dagger2 的Scope)