Scope(作用域) Scope是用来确定注入的实例的生命周期的,如果没有使用Scope注解,Component每次调用Module中的provide方法或者Inject构造函数生成的工厂时都会创建一个新的实例,而使用Scope后可以复用之前的依赖实例。下面先介绍Scope的基本概念与原理,再分析Singleton、Reusable等作用域。
Scope基本概念 先介绍Scope的用法,@Scope是元注解,是用来标记自定义注解的,如下:
1 2 3 4 @Documented @Retention(RUNTIME) @Scope public @interface MyScope {} MyScope就是一个Scope注解,Scope注解只能标注目标类、@provide方法和component。Scope注解要生效的话,需要同时标注在Component和提供依赖的示例的Module或者目标类上。Module中provide方法中的Scope注解必须和与之绑定的Component的Scope注解一样,否者作用域不同会导致编译时报错。例如,CarModule中的provide方法的Scope是MyScope的话,ManComponent的Scope必须是MyScope这样的作用域才会生效,而且不能是@Singleton或者其它Scope注解,不然编译时Dagger2会报错。
那么 Scope 注解又是如何产生作用的呢,怎么保证生成的依赖实例的生命周期呢?
在 Dagger 2 官方文档中我找到一句话,非常清楚地描述了@Scope的原理:
When a binding uses a scope annotation, that means that the component object holds a reference to the bound object until the component object itself is garbage-collected.
当 Component 与 Module、目标类(需要被注入依赖)使用 Scope 注解绑定时,意味着 Component 对象持有绑定的依赖实例的一个引用直到 Component 对象本身被回收。也就是作用域的原理,其实是让生成的依赖实例的生命周期与 Component 绑定,Scope 注解并不能保证生命周期,要想保证赖实例的生命周期,需要确保 Component 的生命周期。