从源码剖析Dagger2:Scope和Subcomponent

本文从源码角度详细介绍了Dagger2中的Scope和Subcomponent概念。讲解了如何通过Scope控制对象生命周期,例如MainViewModel与MainActivity的生命周期绑定。同时,通过Subcomponent实现跨Activity对象共享,如SharedPreferences的全局实例。通过对Dagger生成代码的分析,加深了对Dagger2这两个核心特性的理解。
摘要由CSDN通过智能技术生成

前言

我们接着上一篇博客《从源码剖析Dagger2:Component和Module入门》,继续从源代码级别来深入分析Dagger。本篇博客我们将重点介绍Scope和Subcomponent。

Scope

在任何编程语言中,对象都是定义在一定的作用域中的。一旦程序离开对应的作用域,该对象就要被销毁。在移动设备上,作用域的功能愈发显得重要。因为移动设备上的内存是有限的,只保留需要用到的对象,可以提高内存的使用效率,保证程序的运行流畅度。

MainViewModel只有在MainActivity中被用到,因此它的生命周期应该和MainActivity是一样的。我们可以为MainActivity定义一个新的Scope注解,并把它称之为MainActivityScope,代码如下:

@Scope
@MustBeDocumented
@Retention(value= AnnotationRetention.RUNTIME)
annotation class MainActivityScope

接下来,我们给MainComponent和MainViewModel分别加上MainActivityScope的注解,通过这种方式定义MainViewModel的Scope,并告诉MainComponent如何生成并维护MainViewModel的实例。代码如下所示。

@MainActivityScope
@Component(modules = [MainModule::class])
interface MainComponent {
   
    ...
}

@MainActivityScope
class MainViewModel @Inject constructor(sharedPreferences: SharedPreferences)

我们重新编译项目之后可以发现,和之前生成的代码相比,在为MainActivity注入依赖对象的时候,DaggerMainComponent不再每次创建新的MainViewModel的实例,而是通过Provider来获取MainViewModel的实例。如果MainViewModel已经被创建,就直接返回现有的MainViewModel实例。代码对比如下:

// 不加Scope注解的DaggerMainComponent
private MainViewModel getMainViewModel() {
   
    return new MainViewModel(getSharedPreferences());
}

private MainActivity injectMainActivity(MainActivity instance) {
   
    MainAc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值