美文网首页
Dagger2疑虑

Dagger2疑虑

作者: 岛在深海处 | 来源:发表于2017-06-14 17:12 被阅读0次
    1、@Singleton (可以用来表示全局单例) @Scope(可以用来表示局部单例)
    • 当Component的Modules中有@Singleton标记的Provide方法,当前Component也必须用@Singleton标记。由于Singleton也是被@Scope所标记,所以同理被@Scope标记的Provide方法,Component也需要被标记。

    • @Component的dependencies与@Component自身的scope不能相同,即组件之间的scope不能相同.

    • @Singleton的组件不能依赖其他scope的组件,但是其他scope的组件可以依赖@Singleton组件

    @Singleton实现全局单例的方式比较特殊,必须满足以下几个条件:
    (1)全局单例AppComponent必须保证只被实例化一次。
    (2)即使AppComponent只在Application中实例化一次,也得保证Module中的Provide方法被@Singleton标记。同理,即使Module中的Provide方法与AppComponent都被@Singleton标记,也得保证AppComponent只有一个实例。

    最后网上很多博客讲@Singleton并没有创建单例的能力,我认为这句话欠妥,因为即使AppComponent只在Application中实例化一次,也得保证Module中的Provide方法被@Singleton标记才能实现单例,否则client每次获取依赖都是创建一个新的对象。
    其次我认为自定义@Scope的作用有两点:

    第一:为了更好的管理Component与Module之间的组织方式,提高可读性,能让我们立马就能区分哪些是全局单例,哪些是局部单例。

    第二:被@Scope标记的依赖与component的生命周期(不是整个应用)关联。可以参考下面文章。

    参考:解锁Dagger2使用姿势(二) 之带你理解@Scope
    从Dagger2源码角度理解Scope注解
    详解 Dagger2 的 @Scope 和 @Subcomponent

    疑虑:自定义@Scope标记后,client被销毁后,@Scope生命周期如何结束???
    Dagger2的@Scope的用法介绍 这篇文章最后解决了这个疑虑

    2.Dagger2添加依赖,以及版本号
    // Add Dagger dependencies
    dependencies {
      compile 'com.google.dagger:dagger:2.x' // Dagger2 实际上是java中使用的
      annotationProcessor 'com.google.dagger:dagger-compiler:2.x' // 注解处理器(这个是必须要的)
    }
    

    If you're using classes in dagger.android you'll also want to include:

    compile 'com.google.dagger:dagger-android:2.x' // Dagger2 Android包
    // 如果使用支持包, 上面的Android包可以省略,支持包里面已经包含了
    compile 'com.google.dagger:dagger-android-support:2.x' //  Dagger2 Android 支持包,用于支持v4、v7下的控件
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.x'
    

    2.x中的x表示多少?可以参考https://github.com/google/dagger/releases

    注意添加以上Dagger2依赖会有个编译错误如图:

    Dagger2添加依赖编译报错

    解决方法:

        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.google.code.findbugs', module: 'jsr305' //添加这一行
    })
    

    网上关于Dagger2的博客一般都是按java中的使用方法,这样是很不方便的,在Android中的使用可以参考
    Android项目基本架构(二) Dagger2
    Dagger2 与 AndroidInjector

    相关文章

      网友评论

          本文标题:Dagger2疑虑

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