定义
依赖注入(DI)是一种广泛的应用编程的技术,非常适合Android开发,通过遵循DI的原则,您可以为良好的应用程序架构打下基础。
DI 让开发者能够编写低耦合代码,更容易测试。越是复杂的Android 软件开发周期越长,测试效率也就越重要。我们认为,DI是JUST EAT 代码可配置和可测试的关键,通过DI可以创建一个值得信任的代码库。
尽管我们的代码库相当庞大和复杂,但使用 DI 在一定程度上让我们具备了健壮的测试,从而保证了可以定期迅速地发布。
常见的依赖注入框架
- 在服务器后端,一般使用Spring框架进行依赖注入。
- 在Android上,一般使用Dagger系列进行依赖注入。
两种主要的依赖项注入方式
- 构造函数注入
- 字段注入(setter注入)
依赖注入的优点
- 总的来说:易于复用,易于重构,方便测试
- 重用类以及分离依赖项:更容易换掉依赖项的实现。由于控制反转,代码重用得以改进,并且类不再控制其依赖项的创建方式,而是支持任何配置。比如Car依赖Engine,那么将Engine作为依赖注入,而不是Car中创建Engine实例。如果有Engine的子类想要用Car,则可以直接使用。
- 易于重构:依赖项成为 API Surface 的可验证部分,因此可以在创建对象时或编译时进行检查,而不是作为实现详情隐藏。
- 易于测试:类不管理其依赖项,因此在测试时,可以传入不同的实现以测试所有不同用例。
依赖注入基本概念
编写代码时我们常常会发现有一些类是依赖于其它类的。所以类A可能需要一个类B的引用或对象。为了理解得更清晰些,我们来看看这个需要使用 Engine 类的 Car 类例子。
publicclassCar{privateEngine engine;publicCar(){engine=newPetrolEngine();
这个代码运行正常,但缺点是 Car 和 Engine 之间高度耦合。
Car 类自己创建新的 Engine 对象,则它必须准确知道 Engine 的实现方法,在这个例子中就需要 PetrolEngine 。
我们做些小的改进减少耦合度,来看看创建 Car 类的不同方法吧。
publicclassCar{ privateEngine engine; publicCar(Engine engine){ this.engine=engine;
这里,我们通过Car 的构造函数,向Car 传递了一个Engine 对象。
这意味着两个对象之间的耦合变低了。
Car类不需要知道 Engine 的具体实现,只要继承了原始 Engine 类,任何类型 Engine 都符合要求。
在这个例子中,通过 Car 类的构造函数传递,或者说是注入了依赖。其实我们已经完成了一种称为构造注入的注入方法,当然,我们也可以通过方法注入或是借助 DI 框架直接执行变量注入。
其实,DI仅仅如此。它最基本的用法就是向类中传递一个依赖,而不是直接在类中实例化。
DI库
Dagger
Dagger 是适用于 Java、Kotlin 和 Android 的热门依赖项注入库,由 Google 进行维护。Dagger 为您创建和管理依赖关系图,从而便于您在应用中使用 DI。它提供了完全静态和编译时依赖项,解决了基于反射的解决方案(如 Guice)的诸多开发和性能问题。
Hilt
Hilt 是推荐用于在 Android 中实现依赖项注入的 Jetpack 库。Hilt 通过为项目中的每个 Android 类提供容器并自动为您管理其生命周期,定义了一种在应用中执行 DI 的标准方法。
**Hilt 在热门 DI 库 Dagger 的基础上构建而成,**因而能够受益于 Dagger 提供的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。
其实android使用新技术来开发的时间已经落后与后台和前端了,前端开发的技术理念相对于比较先进,其次后台,最后才是android。所以技术需要进阶。对此我把【华为高级Android开发】整理出的《Android进阶手册》分享出来,许多新技术和高级进阶技术里面都有详细讲解。对此我希望大家好好利用好资源学习起来;能偷懒绝不能勤快。
文末
很多库的出现就是为了能让程序员少写代码的,为了给开发人员偷懒用的。 依赖注入在后台应用已经很多年了,android对它的使用才刚开始。
可能到现在依赖注入大部分android开发都没听过有这个技术,不可否认的是这个技术很牛批,使用起来很方便
|