如果您对依赖注入还不了解,请点击“我”让我们了解更多
Dagger2是一种实现依赖注入的技术手段。
接下来我们就不解释Java注解的概念和用法了。了解有关dagger2 核心的Java 注释的更多信息。
正式开始
在接下来的内容中,我将尝试模仿dagger2 的创建者如何为像dagger2 这样优秀的依赖注入类库完善一个循序渐进的场景(首先,这个场景是基于我的,很淫秽,请不要’模仿这个场景的主要目的是帮助大家一步步了解dagger2。
Inject是什么鬼
我们首先看一下部分代码。
A类{
B b=新B(…);
C c=新C();
D d=新D(新E());
F f=新F(…);
}
上面的代码并没有什么问题,但是我总觉得创建对象的代码基本上是一个重复的手动过程,所以我想想办法把这个重复的手动过程自动化,节省劳动力怎么样?这提高了开发效率,让您能够专注于重要的业务。
您还可以使用注释来标记您的目标类所依赖的其他类。还可以使用注解来标记目标类所依赖的其他类的构造函数。注释的名称是Inject。
A类{
@注入
乙;
}
B类{
@注入
B(){
}
}
这样就可以在你的目标类所依赖的其他类和其他类的构造函数之间建立不可见的连接。但要让它们之间有直接的关系,我们需要一座桥梁来连接它们。因此,这座桥是一个组件。
组件到底是什么?
组件也是注解类。一个类要成为组件,必须用组件注解来注解,并且该类必须是接口或抽象类。具体类的代码我就不解释了。我想用抽象概念来解释组件。如上所述,组件可以充当目标类所依赖的其他类和其他类的构造函数之间的桥梁。
现在让我们看看这座桥是如何工作的。
该组件必须引用目标类的实例。该组件在目标类中查找用Inject 注释的属性。找到相应的属性后,查找该属性的带有Inject 注释的构造函数(发生连接)。剩下的工作是初始化属性的实例并为其赋值。因此,组件也可以称为注入器。
![](//upload-images.jianshu.io/upload_images/1504173-f0998db6b592459c.png?imageMogr2/auto-orient/strip|imageView2/2/
819/格式/网页)
概括
目标类想要初始化它所依赖的其他类。
使用Inject 注释来注释目标类中的其他类。如果其他类使用Inject注解依赖其他类,则重复前两个步骤调用组件的injectXXX(Object)方法。注入器)(injectXXX方法名称是官方推荐的以inject开头的名称)
组件成为注入器,与注入器一样,组件通过将目标类的依赖项的实例注入目标类来初始化目标类的依赖项。
为啥又造出个Module
这里出现了一个新问题。由于您的项目使用了第三方类库,并且您无法修改第三方类库,因此您无法为这些类添加Inject注解。此时,Inject 被禁用。
其次,可以封装第三方类库。如何管理封装的代码?这些封装的代码不能分布在项目内的任何地方,而模块可以承担这个责任。
您可以将封装第三方类库的代码放置在模块中,如下例所示。
@模块
公共类模块类{
//A是第三方类库中的类
提供一个(){
返回A();
}
}
,Module实际上是一个简单的工厂模式,Module内部的方法基本都是创建类实例的方法。下一个问题是,既然该组件是一个注入器,那么如何将组件连接到模块呢?
Component的新职责
组件是一个注入器,其一端连接目标类,另一端将目标类的依赖实例注入到目标类中。由于上述模块是一个提供类实例的类,因此该模块必须属于组件的实例侧(连接其所依赖的各个目标类的实例的一侧)。组件的新作用是管理模块。组件的modules属性可以包含添加模块的组件,一个模块可以添加多个模块。
下一个问题是如何将模块内创建的类的各种实例方法与目标类的Inject 注释所注释的依赖项关联起来。这将显示提供注释。
Provides最终解决第三方类库依赖注入问题
模块中的创建类实例方法使用Provides 注释进行注释。当组件在目标类中搜索带有Inject 注释的属性后,它会移动到模块中查找相应的带有Provides 注释的创建类实例方法。第三方类库使用dagger2来实现依赖注入。
总结
Inject、Component、Module、Provide是dagger2最基本、最核心的知识点。整个dagger2依赖注入框架就搭建完成了。
Inject 主要用于标记目标类和依赖构造函数组件之间的依赖关系。一端是目标类,另一端也是目标类所依赖的类的实例。 Injector负责注入目标类所依赖的目标类,并将该类的实例注入到目标类中。它还管理模块。模块和提供者的诞生是为了解决第三方类库的问题。模块可以包含用于创建类实例的方法。
希望它能帮助您更好地了解dagger2。
作者:我是一名工程师
链接:https://www.jianshu.com/p/cd2c1c9f68d4
其他系列教程的GitHub通讯地址:https://github.com/Timdk857/Android-Architecture-knowledge-2-
最后
多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。
因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。
[外部链接图像正在传输.(img-lh9QMcLw-1718984857066)]
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
获取信息专栏
57066)]
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
获取信息专栏
以上关于#Android-Dagger2的相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91386.html