我正在尝试了解 dagger2 并在我的应用程序中实现。我已经阅读了很多关于它的好处。除非并且直到我完全理解它,否则我无法在我的应用程序中获得它的好处。
我已经了解@Module 和@Inject。让我感到困惑的是@Component。我有几个与此相关的问题。
Module 提供对象实例,Inject 使用它。为什么我们需要介于两者之间的组件?真的有必要弥补差距吗?我们可以有没有任何方法的空接口组件吗?
模块类真的需要构造函数吗?如果模块类中没有构造函数,我们可以使用空构造函数初始化模块类吗?
为什么我们不能直接实例化模块类并构建依赖图,而不是创建组件然后初始化它?
到目前为止,我在组件接口中只看到了两种方法
一个。无效注入(活动/服务/片段);- 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西-
无效注入();- 组件还会生成依赖图吗?
我们可以从其他类而不是活动或服务或片段中注入这样的东西吗?
无效注入(DataManager 数据管理器);
如果 DataManager 是一个单例实例怎么办?
湾。改造 getRetrofit(); 这种方法和上面的方法有什么区别?为什么这不接受任何输入参数?
我读到@Singleton 只是匕首中的一个范围。我们如何才能真正创建一个在应用程序的生命周期中存在的单例对象?
假设有一个我想使用 dagger 构建的 DataManager 实例。它只有一个依赖项。我为此编写了一个模块类和一个组件接口。如果我想在 MainActivity 中使用它,我将它用作
@Inject 数据管理器数据管理器;
...
@覆盖
protected void onCreate(Bundle savedInstanceState) {
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想在许多其他活动中使用这个数据管理器,我不希望它是单例的。我想将它保留在我使用它的当前活动范围内。所以我会用
@Inject 数据管理器数据管理器;
得到那个实例。我应该写吗
DataManagerComponent.Builder...........
在我使用@Inject DataManager dataManager 的每个活动 oncreate() 中?如果我必须写那个,它不会创建比简单使用更多的样板代码吗
数据管理器数据管理器 = 新数据管理器();
假设有 4 个对象,它们相互依赖,例如 D 依赖于 C,C 依赖于 B 等。
D -> C -> B -> A
假设我已经编写了模块类并为所有 4 个提供了方法。如果我尝试在任何 ActivityA 中注入 D
@Inject D d;
C、B、A 会自动实例化吗?
假设在 ActivityB 中我只需要注入 B。如果我像注入 B
@注入 B b;
匕首会再次创建B和A吗?还是会使用已经创建的?
如果有人花时间回答我所有的问题,我将不胜感激。我不期待详细的答案。如果它澄清了这个概念,那很好。期待回复。提前致谢。