Dagger系列:
- Dagger 2从浅到深(一)
- Dagger 2从浅到深(二)
- Dagger 2从浅到深(三)
- Dagger 2从浅到深(四)
- Dagger 2从浅到深(五)
- Dagger 2从浅到深(六)
- Dagger 2从浅到深(七)
- Dagger 2应用于Android的完美扩展库-dagger.android
Demo地址:
Scope,翻译过来的意思是作用域。作用域的理解是变量的作用范围,因此,出现了全局变量和局部变量之分。而,Android开发中,首先也是必须了解的是Activity或者Fragment的生命周期,其决定了在不同的生命周期内,应该做哪些工作。Scope与Activity或者Fragment的生命周期又有什么联系呢?
于是乎,网上的很多例子,将Scope与Activity或者Fragment的生命周期相结合:自定义一个PerActivity/PerFragment注解,那创建的类实例就与Activity/PerFragment“共生死”。
或者用Singleton注解标注一个创建类实例的方法,该创建类实例的方法就可以创建一个唯一的类实例。
当时,一无所知,也就是这么认为了,跳进了这深深的大坑。对PerActivity/PerFragment,或者Singleton产生了深深的疑惑:
- Scope到底是什么?如何决定作用域的,是不是与变量本身的作用域一致?
- PerActivity/PerFragment怎么与Activity/PerFragment的生命周期相关联的?
带着疑惑,查阅各种资料,翻看官方文档,最后才发现,竟然与当前的认识不一致,可以这么说,我被Scope的字面意思带偏了,或者说对Scope的理解不够,自己掉进了,自己挖的坑里。坑有多深,往下看…
@Scope
package javax.inject
@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
@Documented
public @interface Scope {}
@Scope是javax.inject包下的一个注解,其是用来标识范围的注解,该注解适用于注解包含可注入的构造函数的类,并控制该如何重复使用类的实例。在默认情况下,也就是说仅仅使用@Inject注解构造函数,而没有使用@Scope注解类时,每次依赖注入都会创建一个实例(通过注入类型的构造函数创建实例)。如果使用了@Scope注解了该类,注入器会缓存第一次创建的实例,然后每次重复注入缓存的实例,而不会再创建新的实例。
注意:
如果多个线程都可以访问该作用域的实例,它的实现应该是线程安全的。
这里,我们先自定义一个Scope - TodoScope:
@Scope
@Documented
@Retention(RUNTIME)
public @interface TodoScope {
}
然后,自定义两个类OrangeBean和BananaBean,它们的构造函数都被@Inject注解。不同的是,OrangeBean被@TodoScope注解,而BananaBean没有被注解。
@TodoScope
publi