美文网首页
初识 Dagger 2

初识 Dagger 2

作者: raywalker | 来源:发表于2022-01-25 21:29 被阅读0次

    介绍

    Dagger 2 也依照JSR 330 支持声明注入点(injection sites)。Dagger 2中支持所有Dagger 1 支持的注入类型(按字段和构造方法注入),此外Dagger2 还支持方法注入(method injection),而不支持静态注入(static injection)。对于范型class,Dagger 2 也不提供注入支持。

    • 构造方法注入
    class Thermosiphon implements Pump {
      private final Heater heater;
    
      @Inject
      Thermosiphon(Heater heater) {
        this.heater = heater;
      }
    }
    

    通过上面的注入声明,在Dagger创建 Thermosiphon 实例时,Dagger会获取所需的构造方法参数,并调用该构造方法来实现。

    • 字段注入
    class CoffeeMaker {
      @Inject Heater heater;
      @Inject Pump pump;
    }
    

    与Dagger 1的异同

    Module

    Dagger 2 中的Module与Dagger 1 中的很类似,但是减少了配置的复杂性。

    Provides

    Provides 注解与之前有着相同的语义。

    Component 与 Builder

    与Dagger1中不同的是,不必实例化ObjectGraph对象,而采取定义Component,在其中声明关联的Modules。同时定义Component.Builderinterface可以自定义Component的创建过程。

    Component间的关系

    Dagger1中使用objectGraph.plus(new ChildGraphModule()), 可以从现有的Graph中创建新的Graph;类似的,Dagger2可以通过定义Subcomponent来实现。

    @SubComponent(modules = {ChildGraphModule.class} )
    interface MySubcomponent {
    }
    
    @Component
    interface MyComponent {
      /* Functionally equivalent to objectGraph.plus(childGraphModule). */
      MySubcomponent plus(ChildGraphModule childGraphModule);
    }
    
    MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule());
    

    Scope

    对应不同的生命周期,可以声明有不同生命周期的component(e.g. Android 中Application VS. Activity)。每个component可以通过修饰的scope注解关联到特定的scope。组件的实现确保每个component的实例只有一种对应的scope绑定相关联。如果component声明了一种scope,它就只能包含graph中没有scope的绑定或是相同scope的绑定。

    @Singleton  
    @Component
    interface MyApplicationComponent {
        // this component can only inject types using unscoped or @Singleton bindings
    }
    

    Android 上除去样板代码的优化

    在扩展对Android支持后,如com.google.dagger:dagger-android:2.16中可以通过AndroidInjection.inject(activity)AndroidSupportInjection.inject(fragment) 注入Activity/Fragment中的依赖。

    详细示例可以参考 Google官方 demo Github Browser Sample

    Dagger Hilt

    随着 Dagger2 的演变,复杂度也随之增长;特定于Android平台上Google推出了基于Dagger2的 Hilt,用以简化Android app中的使用。限于篇幅,待下回分解吧。

    References

    相关文章

      网友评论

          本文标题:初识 Dagger 2

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