我想了解dagger2并在我的应用程序中实现.我已经阅读了很多关于它的好处.除非我完全理解,否则我无法在我的应用中获得它的好处.
我已经理解了@Module和@Inject.令我困惑的是@Component.我几乎没有相关的问题.
Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?我们可以使用没有任何方法的空接口组件吗?
构造函数对于模块类是否真的必要?如果模块类中没有构造函数,我们可以使用空构造函数初始化模块类吗?
为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它?
到目前为止,我在组件接口中只看到了两种方法
一个.void inject(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -
void inject(); - 组件是否仍会生成依赖图?
我们可以从活动或服务以外的其他类注入或者像这样的片段 -
void inject(DataManager dataManager);
如果DataManager是单例实例怎么办?
湾 改造getRetrofit(); 这种方法和上面的方法有什么区别?为什么不采用任何输入参数?
我读到@Singleton只是匕首的范围.我们怎样才能真正创建一个在应用程序的生命周期内存在的单例对象?
假设我想使用dagger构建一个DataManager实例.它只有一个依赖.我为此编写了一个模块类和一个组件接口.如果我想在MainActivity中使用它,我会用它作为
@Inject DataManager dataManager;
...
@覆盖
protected void onCreate(Bundle savedInstanceState){
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想在许多其他活动中使用这个数据管理器,我不希望它是单例.我想将它保持在我使用它的当前活动范围.所以我会用
@Inject DataManager dataManager;
得到那个实例.我应该写
DataManagerComponent.Builder...........
在每个活动oncreate()我使用@Inject DataManager dataManager?如果我必须写它,它不会创建更多的样板代码而不是简单地使用
DataManager dataManager = new DataManager();
假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.
D - > C - > B - > A.
让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA中注入D
@Inject D d;
C,B,A会自动实例化吗?
让我们假设在ActivityB中我只需要注入B.如果我注入B就好了
@Inject B b;
匕首会再创造B和A吗?或者它会使用已经创建的那些?
如果有人花时间回答我的所有问题,我感激不尽.我不指望详细的答案.如果澄清这个概念就好了.期待着回应.提前致谢.
1> 小智..:
这感觉更像是勺子喂食.我会尽力给你尽可能多的信息.
1 - > Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?Interface
没有任何方法我们可以有空组件吗?
良好代码的基本原则之一是; 坚固.这给我们带来编码到界面的原则我在SOL 我 .D.
Dagger
组件是interfaces
它会boilerplate code
为您生成的; 它还可以帮助我记录我的对象图.
2 - > 是constructor
对模块类真的有必要吗?如果constructor
模块类中没有,我们可以使用空初始化模块类constructor
吗?
在模块类中,constructor
主要用于外部依赖项.你可以选择不拥有一个.在这里你可以打电话给你的组件并直接说MyComponent.create()
3 - > 为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它?
这就像不使用dagger
.在依赖注入开始之前,开发人员仍然可以遵循SOLID原则.但是使用Dagger
类似的框架它迫使开发人员考虑解耦实现.
4 a - >*void inject(Activity/Service/Fragment);
- 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -
void inject(); - Will the component still generate dependency graph?
我们可以从活动或服务以外的其他类注入或者像这样的片段 -
void inject(DataManager dataManager);
如果DataManager
是singleton instance
?*
你需要提到目标Dagger
.它不可能interface
,Object
可能singleton
没关系.
4 b - > Retrofit getRetrofit();
这种方法和上述方法有什么区别?为什么不采用任何输入参数?
这是组件的定义.如果您使用构造函数注入,并且如果您更改输入参数的数量,则表示您不必每次都更改代码.Dagger
会照顾它.上面的代码我认为是组件定义的一部分,所以当你做组件依赖时,它将帮助你将它暴露给外层图
5 - > 我读到@Singleton
的只是一个范围dagger
.我们如何才能真正创建一个singleton object
终身应用程序的生命?
Thumb规则在您的模块中,如果您给出一个范围并仅创建该组件一次那么它将存在于整个生命周期中.通常,在APP的Application类中创建一个具有应用程序范围组件的组件.
6 - >*让我们假设有一个DataManager
我想用dagger构建的实例.它只有一个依赖.我为此编写了一个模块类和一个组件interface
.如果我想MainActivity
使用它,我会用它作为
@Inject DataManager dataManager;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想datamanager
在许多其他活动中使用它,我不希望它是单身.我想将它保持在我使用它的当前活动范围.所以我会用
@Inject DataManager dataManager;
得到那个实例.我应该写
DataManagerComponent.Builder...........
在oncreate()
我使用的每一项活动中@Inject DataManager dataManager
?如果我必须写它,它不会创建更多的样板代码而不是简单地使用
DataManager dataManager = new DataManager();*
这里你不应该向datamanager
提供者提供任何范围,然后每当你说@inject datamanager
它将作为不同的对象实例时,即使你的组件是singleton
范围.
7 - >*让我们假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.
D -> C -> B -> A
让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA
类似的情况下注入D
@Inject D d;
C,B,A会自动实例化吗?
让我们假设ActivityB
我只需要注入B.如果我注入B就好了
@Inject B b;
会再dagger
创造B和A吗?或者它将使用已经创建的那些?*如果注入是通过构造函数创建的,或者你将使用成员注入器,它将被创建.
请仔细阅读YouTube tutorials
扭曲的方程式dagger2
.这有助于我理解Dagger2
.
如果这对你有所帮助,请投票.