@scope其实为了实现单例
在dagger2 中有一个@Singleton 是它的具体实现,但是我们一般开发由于限制原因不会用到@Singleton
首先介绍下Compent的配置,我们有一个ApplicationCompent , 通常全局单例就放入这里面,其它的ActivityCompent都会依赖它,目的就是需要获取ApplicationCompent中已经创建的实例,来保证单例。
@scope是成对出现的,
只有在Model中配置了@scope 并且在注入这个Model的Compent中配置同名的@scope ,才能确保这个Model在Compent的范围类保证单例
所以比如我们自定义一个ApplicationScope
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}
这个@ApplicationScope 需要同时定义在Model和Compent中
@ApplicationScope
public class Init {
@Inject
public Init(){
}
}
@ApplicationScope
public interface MyApplicationCompoent {
void inject(MyApplication application);
Init getInit();
}
这里表示我的Init在MyApplication中全局单例。
看看生成的代码
this.initProvider = DoubleCheck.provider(Init_Factory.create(getProvider));
在每次创建Init的工厂时,使用了DoubleCheck来创建,形成了单例。
同理,
1.只要其他ActivityCompent依赖我的MyApplicationCompoent,就能够保证Init为单例模式
2.我们可以继续建立@ActivityScope 来保证某个Model在某个Activity的单例性质。
tip:@scope的名称随意,只要在Model和Compent中成对出现即可