美文网首页
Dagger2 中@scope的一点想法

Dagger2 中@scope的一点想法

作者: 浮云骑士_ | 来源:发表于2017-03-16 15:50 被阅读0次

    @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的一点想法

          本文链接:https://www.haomeiwen.com/subject/fnrjnttx.html