当前位置: 首页 > 知识库问答 >
问题:

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

公冶光亮
2023-03-14

我读过很多关于dagger 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

什么决定了Dagger 2中组件(对象图)的生命周期?

等等。

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

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

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

如果我想从组件中获得一个单例实例,我是否必须用@singleton或自定义范围注释该组件,并在应用程序类中构建该组件?

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

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

同样,我有一个自定义作用域的组件,比如说@ActivityScope,我在ActivityA和ActivityB中构建了这个组件,ActivityA和ActivityB会共享来自这个组件的相同对象实例,还是会拥有自己的相同对象实例?

共有1个答案

裴和怡
2023-03-14

我的理解是:

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

1) 组件可以按照您的意愿使用多久,或者只要创建组件的类没有被破坏(比如android活动或片段)

2) 如果不进行注释,则为方法提供注释(必须与组件注释相同),每次请求时都会创建新对象

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

应用程序类中内置的组件可以使用多长时间。我的意思是,你可以在任何时候创建它,也可以在任何时候删除它,只要你在扩展android应用程序类的类中创建它(这样,组件对象就会在你的android应用程序运行时一直存在),而不是在活动类中构建组件——它会在活动存在时一直存在,所以它可能会被销毁关于方向改变。请记住,如果出于某种原因,您没有在应用程序类的onCreate()方法中创建ApplicationComponent(例如,您后来在发生某些事情时创建了它),那么当Android操作系统内存不足且用户关闭您的应用程序时,它可能会被销毁(为空),然后,当用户返回到您的应用程序(最后可见的活动)时,它已经被杀死,您要求您的应用程序组件做一些事情,然后检查它是否为空

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

我在上面的回答中部分地回答了这个问题。如果您在片段/活动内创建组件,则只要您愿意,或者只要活动或片段未因方向更改或内存不足而被破坏,它就可以使用

如果我想从组件中获得一个单例实例,我是否必须用@singleton或自定义范围注释该组件,并在应用程序类中构建该组件?

这取决于您想在何处使用此单例。如果您希望在单个活动中使用单例,您可以创建@ActivityScope annotation和annotate,并使用此批注提供方法和ActivityComponent,然后在onCreate()Activity方法中创建ActivityComponent,在活动的生命周期内拥有一个单例(如果您计划在同一活动的不同片段之间共享一个单例,这可能会很有帮助)。如果您希望在应用程序中的不同活动/片段之间使用单例,最好的方法是在AppModule中创建它,并用单例注释提供方法和应用程序组件。

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

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

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

同样,我有一个自定义作用域的组件,比如说@ActivityScope,我在ActivityA和ActivityB中构建了这个组件,ActivityA和ActivityB会共享来自这个组件的相同对象实例,还是会拥有自己的相同对象实例?

他们将有自己的实例

 类似资料:
  • 我正在使用MVP架构,我需要为不同的活动注入不同的演示者。为此,我创建了@ActivityScope。这是否意味着我必须为每个活动创建一个单独的模块/组件? 如果我仍然负责创建和释放那些依赖项,那么自定义范围注释的目的是什么?不确定我是否正确,但我可以在所有模块/组件中使用@scope123,这不会有任何区别。

  • 1. 前言 ​ 上一节,我们多学习了一种初始化 Spring 容器的方式,那么不管是何种初始化容器的方式,目的都是对容器中的 bean 实例做管理的。 本节我们就学习 Spring 的容器如何管理对象的实例的。主要在于两个方向: 对象的生命周期 对象的作用范围 2. 对象的生命周期 2.1. 生命周期的概念 ​ 生命周期,通俗的理解就是从出生到死亡的过程,那么对于对象而言,就是实例在 Spring

  • 一般来说,一个组件类由 extends Component 创建,并且提供一个 render 方法以及其他可选的生命周期函数、组件相关的事件或方法来定义。 {% include './share/simple-component.md' %} getInitialState 初始化 this.state 的值,只在组件装载之前调用一次。 如果是使用 ES6 的语法,你也可以在构造函数中初始化状态,

  • 主要内容:挂载,更新,卸载,实例,实例,React 实例,React 实例在本章节中我们将讨论 React 组件的生命周期。 组件的生命周期可分成三个状态: Mounting(挂载):已插入真实 DOM Updating(更新):正在被重新渲染 Unmounting(卸载):已移出真实 DOM 挂载 当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下: : 在 React 组件挂载之前,会调用它的构造函数。 : 在调用 render 方法之前调用,并且在初始挂

  • 与React 组件一样,Rx组件同样具备以下生命周期 组件加载: componentWillMount 组件加载: componentDidMount 组件更新: componentWillReceiveProps 组件更新: shouldComponentUpdate 组件更新: componentWillUpdate 组件更新: componentDidUpdate 组件卸载: compone

  • - 当输入绑定值更改时调用 ngOnInit - 第一次ngOnChanges之后 ngAfterContentInit - 组件内容初始化之后 ngAfterContentChecked - 在每次检查组件内容后 ngAfterViewChecked - 在每次检查组件视图后 ngOnDestroy - 只在组件被销毁之前