Dagger 2 组件、模块和范围的生命周期

Posted

技术标签:

【中文标题】Dagger 2 组件、模块和范围的生命周期【英文标题】:Dagger 2 lifecycle of a component, module and scope 【发布时间】:2016-10-17 08:14:39 【问题描述】:

我已经阅读了很多关于匕首 2 的帖子和教程:

http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/

https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/

https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2

What determines the lifecycle of a component (object graph) in Dagger 2?

等等

但我仍然对组件的生命周期以及它与模块和范围的关系感到困惑。当我只想要一个单例时,我想确保不会创建一个对象的多个实例。希望有人能对这些有所了解:

应用程序类中构建的组件的生命周期是什么?

在 Activity 或 Fragment 类中构建的组件的生命周期是什么?

如果我想要来自组件的单例实例,我是否必须使用 @Singleton 或自定义范围注释组件并在应用程序类中构建该组件?

如果我在应用程序类中构建一个组件,这是否意味着通过该组件可用的所有对象实例都将是整个应用程序中的单例实例,直到应用程序被杀死或重新启动?

我有一个自定义范围的组件,比如说@ActivityScope,我在一个 Activity 中构建该组件,通过该组件注入的对象实例是否会在该 Activity 的 onDestroy() 被调用后自动销毁?

再次,我有一个具有自定义范围的组件,比如说@ActivityScope,我在 ActivityA 和 ActivityB 中构建这个组件,ActivityA 和 ActivityB 将共享来自该组件的相同对象实例,或者它们将拥有自己的相同对象实例?

【问题讨论】:

【参考方案1】:

我是怎么理解的:

请记住两件事(当我第一次阅读 1 时)它让我觉得一切都变得更干净了):

1)只要您希望它存在,或者只要创建组件的类没有被销毁(如 android 活动或片段),组件就会存在

2)如果您不注解,则提供带有注解的方法(必须与组件注解相同),每次请求时都会创建新对象

应用程序类中构建的组件的生命周期是什么?

应用程序类中内置的组件可以随心所欲地存在。我的意思是您可以随时创建它并随时删除它,只要您在扩展 android Application 类的类中创建它(这样,只要您的 Android 应用程序正在运行,组件对象就会一直存在)与构建的组件相反在活动类中 - 只要活动还活着,它就会一直存在,因此它可能会在例如方向改变时被破坏。 请记住,如果由于某种原因您没有在 Application 类的 onCreate() 方法中创建 ApplicationComponent(例如,您稍后在发生某些事情时创建了它),那么当 Android 操作系统的内存和用户不足时,它可能会被销毁(无效)关闭您的应用程序,然后当用户返回您的应用程序(到最后一个可见活动)时,它已被早些时候杀死并且您要求您的应用程序组件做某事然后检查它是否不为空

在 Activity 中构建的组件的生命周期是什么? 片段类?

我在上面的答案中部分回答了它。如果你在 Fragment/Activity 中创建你的组件,只要你想要,或者只要 Activity 或 Fragment 没有因为方向改变或内存不足而被破坏,它就会一直存在

如果我想要一个组件的单例实例,我必须注释吗 具有@Singleton 或自定义范围的组件并构建它 应用程序类中的组件?

这取决于你想在哪里使用这个单例。如果您想在单个活动中使用单例,您可以创建例如 @ActivityScope 注释并使用此注释注释提供方法和 ActivityComponent,然后您在 onCreate() Activity 方法中创建您的 ActivityComponent 并且只要您的活动存在,您就有一个单例(它可能如果您计划在同一活动的不同片段之间共享一个单例,这会很有帮助)。 如果您希望应用程序中不同活动/片段之间的单例,最好的方法是在 AppModule 中创建它并使用单例注释注释提供方法和应用程序组件。

如果我在应用程序类中构建一个组件,这是否意味着所有 通过此组件可用的对象实例将是 整个应用程序中的单例实例,直到应用程序被杀死或 重启了吗?

如果您使用 @Singleton 注释来注释提供方法,那么是的

我有一个自定义范围的组件,比如说@ActivityScope,我 在 Activity 中构建该组件,将对象实例 通过此组件注入将在此之后自动销毁 Activity 的 onDestroy() 被调用了吗?

是的

我有一个自定义范围的组件,比如说@ActivityScope, 我在 ActivityA 和 ActivityB 中构建这个组件,将 ActivityA 和 ActivityB 共享来自该组件的相同对象实例或 他们会有自己的同一个对象的实例吗?

他们会有自己的实例

【讨论】:

能否请您提供 dagger2 文档中关于 1 和 2 的证明?

以上是关于Dagger 2 组件、模块和范围的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

react 生命周期

项目管理02 | 项目管理基础-信息系统项目的生命周期模型

CocosCreator 生命周期

react父子组件生命周期执行顺序

react生命周期,以及各个周期都做了啥

Dagger2入门详解