Dagger2管理对象的方式
从Component 开始
- 添加有@Scope 的说明是单例
- 否则每次注入都会重新获取
- new Object()
- 调用module 里面的方法
- 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
解答:
- 不管是@Singleton 还是自定义的@UserScope,本质都是@Scope
- @Scope的Target是ANNOTATION_TYPE,所以只能用来定义注解,否则压根就没有自定义注解的事
- 本质一样,所以定义两个别名的@Scope用到一起就没有意义了
问题2:@Singleton @UserScope @ActivityScope @AppScope 有什么区别
解答:
- Dagger2 只有Scope,其他都是Scope的别名,只是为了编程的时候清晰自己在写什么。
- Dagger2 是使用Component 来管理注入对象的
单例场景@Singleton
- 自己保证使用的是同一个Component,之后使用这个Component来注入对象
- 我们会在Application 创建的时候初始化好AppComponent,这样再以后注入对象的时候使用这个AppComponent 才能保证对象是单例的
- 如果你傻乎乎的,再次创建AppComponent 来注入,那么对不起,你这个已经不是单例了
UserScope 场景
- 自己保证用户登录的时候初始化UserComponent
- 注入的时候使用这个UserComponent注入
- 用户退出的时候把UserComponent 销毁掉
作用
- 对象的使用范围
- 对象的生命周期
- 对象的创建与销毁
- 对象什么时候创建,什么时候销毁的定义
Dagger2 提供的Scope
- @Singleton 单例
常用的Scope
- @ApplicationScope 注解的Component类与Application对象的生命周期一致
- @ActivityScope注解的Component类与Activity的生命周期一致
- @UserScope - 用于与当前用户联系起来的类实例的scope(在真实的app中可以是当前登录的用户)
场景重现
我们定义了三个Component:AppComponent、UiComponent、UserComponent
在Application 创建的时候创建AppComponent,这个AppComponent 一直保存着
在Activity 创建的时候创建UiComponent,这个UiComponent 的生命周期与Activity 生命周期绑定
在User 登录的时候创建UserComponent,这个UserComponent 在用户退出的时候销毁
理解一点
Component 与 Scope 与 Module 与 Object 一致的
网友评论