Dagger2 中@scope的一点想法

@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中成对出现即可

你可能感兴趣的:(Dagger2 中@scope的一点想法)