Dagger 2 瞄准镜寿命

0 java android dependency-injection dagger-2

我目前正在熟悉 dagger2 和一般的依赖注入。我认为我对基础知识有很好的掌握,但我在理解范围方面有困难。有两件事我想帮助理解。A) 关于作用域生命周期,以及 B) 关于多次重用作用域。

当谈到范围时,范围的生​​命周期的想法总是会出现。我认为对于在给定范围下提供的依赖项,将在该范围“活动”时提供单个实例。究竟是什么决定了作用域是活的还是死的?它是否与用它注释的组件的生命周期有关?如果该组件超出范围并且被 GC 处理,那么该范围是否已消亡?

还有一个相关的问题:假设我有一些依赖项,我想将其范围限定为两个活动之一。我是否需要创建两个单独的作用域(即@MainActivityScope@SettingsActivityScope),或者我可以使用一个通用的活动作用域 ( @ActivityScope),我对两者都使用但它表示两个单独的作用域,具体取决于它的使用方式?也许当我理解了我的第一个问题时,就会帮助我理解这个问题的答案。

谢谢。

Jef*_*ica 5

Dagger 以最简单的方式处理范围:范围属于 Component实例。如果您有一个作用域绑定,它会存储在具有匹配作用域的 Component 实例中并从中检索。

@Singleton @Component(...) public interface MyComponent {
  ActivityComponent createActivityComponent(); // creates a new ActivityComponent

  Thing1 getThing1();  // @Singleton

  Thing2 getThing2();  // no scope
}

@ActivityScope @Subcomponent(...) public interface ActivityComponent {
  Thing3 getThing3();  // @ActivityScoped

  Thing4 getThing4();  // no scope
}
Run Code Online (Sandbox Code Playgroud)

“生或死”的概念在这里并不真正相关。重要的是,通过您创建的每个 ActivityComponent,您将获得不同的 Thing3 实例,但获得相同的 Thing1 实例。如果您为您创建的每个活动创建一个新的 ActivityComponent 实例,那么当活动被销毁时,该 Component 将(理想情况下)变得无法访问并被收集。但是,就 Dagger 而言,您可以根据需要创建任意数量的 ActivityComponent 并让它们共存。

MyComponent myComponent = DaggerMyComponent.create();
Thing1 a = myComponent.getThing1();
Thing1 b = myComponent.getThing1();  //  b == a
Thing2 c = myComponent.getThing2();
Thing2 d = myComponent.getThing2();  //  c != d
Run Code Online (Sandbox Code Playgroud)

Unscoped 意味着每次注入的新实例。现在让我们试试子组件:

ActivityComponent activityComponent1 = myComponent.createActivityComponent();
Thing3 e = activityComponent1.getThing3();
Thing3 f = activityComponent1.getThing3();  //  e == f
ActivityComponent activityComponent2 = myComponent.createActivityComponent();
Thing3 g = activityComponent2.getThing3();  //  e != g

// But you can still use activityComponent1. It's not dead.
Thing3 h = activityComponent1.getThing3();  //  e == h
Run Code Online (Sandbox Code Playgroud)

自然,这也会通过图传播:如果 Thing2 依赖于 Thing1,则您可能有许多 Thing2 实例,每个实例都依赖于一个共同的单例 Thing1 实例。如果 Thing4 依赖于 Thing1、Thing2 和 Thing3,那么您可能有许多 Thing4 实例,每个实例都有自己的 Thing2,Thing3 在同一活动(组件)内共享,Thing1 在同一整体(应用程序/单例)组件内共享.

只要它们都是独立层次结构的一部分,您就可以拥有任意数量的 ActivityComponents,或者任意数量的 @ActivityScoped 组件。您可以选择创建一个@ActivityScoped MainActivityComponent 和一个@ActivityScoped SettingsActivityComponent,或者创建一个知道如何分别注入的公共 ActivityComponent。您可能不需要@MainActivityScope 和@SettingsActivityScope,因为其中一个永远不会派生自另一个。重要的是,你创建一个新的@ActivityScoped组件实例每个活动实例,这是所有匕首需要保持作用域对齐。