Android | 依赖注入与 Dagger2 框架【@Deprecated】

简介: Android | 依赖注入与 Dagger2 框架【@Deprecated】

前置知识


这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~



1.  什么是依赖注入?


在软件设计中,我们会根据不同的职责将代码划分为不同的类。而不同类之间又会相互组合,形成依赖关系。例如在 Android 应用的登录流程时,LoginActivity 依赖于 LoginViewModel,而又依赖于 UserRepository。

image.png


—— 引用自 developer.android.google.cn/training/de… —— Android Developers

LoginActivity 类获得依赖对象的最直接方式是在类内部构造依赖对象,例如:


val retrofit = Retrofit.Builder()
    .baseUrl("https://example.com")
    .build()
    .create(LoginService::class.java)
val remoteDataSource = UserRemoteDataSource(retrofit)
val localDataSource = UserLocalDataSource()
val userRepository = UserRepository(localDataSource, remoteDataSource)
loginViewModel = LoginViewModel(userRepository)
复制代码


这种方法最为常见,但是问题也很多:


  • 1、无法复用代码 / 对象: 如果项目中其他地方需要创建依赖对象,需要使用重复的代码 ,对象也需要重复创建;
  • 2、必须按顺序创建对象: 必须先实例化 UserRepository,才能实例化 LoginViewModel;


为了优化这些问题,可以用以下两种方式改进:


  • 1、服务提供模式:从外部服务容器抓取依赖对象
  • 2、依赖注入:并以参数的形式注入依赖对象


可以发现,第一种和后面两种的区别在于 构造依赖对象的位置是在类内部 / 类外部。如果构造依赖对象的位置是在类外部,则称为控制反转(Inversion of Control,IoC)。IoC 可以认为是一种设计模式,但是由于理论成熟的时间相对较晚,所以没有包含在《设计模式·GoF》之中。


1.2 服务提供模式(Service Locator Pattern)


创建一个依赖容器类,用于构造并存储依赖对象。调用方主动从外部服务容器抓取依赖对象,例如:


服务提供容器
class AppContainer {
    private val retrofit = Retrofit.Builder()
        .baseUrl("https://example.com")
        .build()
        .create(LoginService::class.java)
    private val remoteDataSource = UserRemoteDataSource(retrofit)
    private val localDataSource = UserLocalDataSource()
    val userRepository = UserRepository(localDataSource, remoteDataSource)
}
复制代码
class MyApplication : Application() {
    val appContainer = AppContainer()
}
复制代码
val appContainer = (application as MyApplication).appContainer
loginViewModel = LoginViewModel(appContainer.userRepository)
复制代码


1.3 依赖注入(Dependency Injection)


在类外部构造依赖对象,并以参数的形式注入依赖对象,例如在构造器、setter 方法注入,所以其实我们一直都在使用依赖注入。依赖注入与服务提供模式的本质区别是:使用服务提供模式时,调用方可以控制请求依赖对象的时机;而使用依赖项注入方式时,一般由外部主动注入所需对象。


1.4 小结


使用依赖注入可以为我们带来以下好处:


  • 1、在外部注入或配置依赖项,因此我们可以重用这些组件。当我们需要修改依赖项的实现时,不需要大量修改很多处代码,只需要修改一小部分代码;
  • 2、可以注入依赖项的模拟实现,让代码测试更加容易。


2. Android 依赖注入框架


上一节我们解释了依赖注入的概念,其实我们平时无意中就在使用依赖注入了。当只有一个依赖项时,手动进行依赖注入很简单,但随着项目规模变大,手动注入会变得越来越复杂。


而使用依赖注入框架,可以让依赖注入的过程更加简便,可以归为两类:


  • 1、基于反射的动态方案

例如 Google guice,但由于使用了反射,性能上会有损耗。


  • 2、基于编译时注解的静态方案

例如 Dragger(:['dægə])、Hilt([hɪlt]) 和 ButterKnife。其中  ButterKnife 只能实现控件的依赖注入,而 Dragger 和 Hilt 的应用场景更广。基于编译时注解的方案可在编译时生成链接依赖项的代码,因此不会使用反射。


2.1 Dagger


Dagger 框架最初由 Square 组织开发,而后来的 Dagger2 和 Hilt 框架则由 Square 和 Google 共同开发维护。Dagger 的名字取自有向无环图(DAG,Directed acyclic graph),Dagger 本质上不是提供了依赖注入的能力,而是采用了注解的形式让依赖注入变得更加简易


2.2 Hilt


Hilt 其实是针对 Android 平台对 Dagger2 的二次封装,Hilt 本质上是对 Dagger 进行场景化,它为 Android 平台制定了一系列规则,大大简化了 Dagger 的使用。在 Dagger 里,你需要手动获取依赖图和执行注入操作,而在 Hilt 里,注入会自动完成,因为 Hilt 会自动找到 Android 系统组件中那些最佳的注入位置。


3. Dagger2


学不动了,Dagger2 就到这里,先把 Hilt 安排上。



4. 总结


  • 1、依赖注入在类外部构建依赖对象,使得依赖项的代码和组件能够重用,也可以注入依赖项的模拟实现,使代码更易于测试;
  • 2、Dagger 本质上不是提供了依赖注入的能力,而是采用了注解的形式让依赖注入变得更加简易;Hilt 是对 Dagger2 的二次封装,本质上是对 Dagger进行场景化;
目录
相关文章
|
3月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
4月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
17天前
|
算法 JavaScript Android开发
|
26天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
96 1
|
2月前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
356 3
|
2月前
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
77 8
|
2月前
|
API Android开发 iOS开发
掌握安卓与iOS应用开发中的依赖注入技术
本文探讨了在安卓和iOS应用开发中,如何有效利用依赖注入技术来提升代码的模块化、可测试性和可维护性。通过对比分析两种平台下依赖注入的实现方式与工具,本文旨在为开发者提供一套清晰、实用的依赖管理策略,助力打造高质量软件产品。
|
3月前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
3月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
如何使用Amlogic T972安卓9.0系统上的misc框架来简化驱动程序开发,通过misc框架自动分配设备号并创建设备文件,从而减少代码量并避免设备号冲突。
46 0
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
|
3月前
|
存储 前端开发 Java
Android MVVM框架详解与应用
在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细介绍Android MVVM框架的基本概念、优势、实现流程以及一个实际案例。
105 0
下一篇
无影云桌面