vvLavida / TechNotes

Issuses for coding summarize.
GNU General Public License v3.0
6 stars 3 forks source link

模块解耦 - Android平台依赖注入框架使用(Dagger) #28

Open vvLavida opened 8 years ago

vvLavida commented 8 years ago

依赖注入(也叫做控制反转)已在一些流行的框架中(如 Spring 和 Google Guice)占有重要的位置。然而这些框架仅仅是针对标准JVM而设计的,并不支持诸如Android之类的移动环境。当RoboGuice正尝试提升Guice在Android的体验之时,Dagger通过专注于一种简化的功能集以一种不同的方式达到了更好的性能。

Dagger最早由Jake Wharton开发与维护,后来转给Google维护。

就目前来看,Dagger支持的功能仅是Google Guice的子集。考虑到这两个框架的负责人员存在重叠,所以这是可以理解的。然而,Dagger拥有更小型的配置,并且非常明确是针对Android开发的,而它最明显的不足是缺少对于方法和字段的注入支持。

Dagger牺牲了这项功能却提升了错误检查及探测方面的能力。通常依赖注入错误要等到应用开始运行期间才能得到运行时报告。Dagger却包含了注解的编译时检查,对于不完整的绑定会触发编译错误。这个功能将使得在Android上的应用开发变得更加轻松。

另一项较大的不同之处是,相比于其他流行的框架,Dagger只有较少的支持范围。Dagger仅支持@Singleton注解。同样这也是可以预料的,因为Android开发的需求有别于标准的Web开发(Web开发伴随着请求和会话的范围)。

vvLavida commented 8 years ago

Dagger Dagger 源码解析

Dragger2 起源于Square的Dagger,是一个完全在编译期间进行的依赖注入框架,完全去除了反射。 Dagger2的初衷就是通过依赖注入让你少些很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块。你可以在Debug包,测试运行包以及release包优雅注入三种不同的实现。

http://blog.zhaiyifan.cn/2016/03/27/android-new-project-from-0-p4/

vvLavida commented 7 years ago

Dagger2 Dependency Injection with Dagger 2 Dependency Injection with Dagger 2 中文

Dagger2是什么?

安卓应用在初始化对象的时候经常需要处理各种依赖关系。比如说网络访问中使用Retrofit,Gson,本地存储中使用shared preference。无一例外,我们都都需要在使用它们的地方进行实例对象构建,对象之间可能还存在着各种各样的依赖关系。 依赖注入(Dependency Injection,简称DI)是用于削减计算机程序的耦合问题的一个法则。对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。 Dagger2 正是一个依赖注入框架,使用代码自动生成创建依赖关系需要的代码。减少很多模板化的代码,更易于测试,降低耦合,创建可复用可互换的模块。

Dagger2的优点

全局对象实例的简单访问方式 和ButterKnife 库定义了view,事件处理以及资源的引用一样,Dagger2 提供全局对象引用的简易访问方式。声明了单例的实例都可以使用@inject进行访问。比如下面的MyTwitterApiClient 和SharedPreferences 的实例:

public class MainActivity extends Activity { @Inject MyTwitterApiClient mTwitterApiClient; @Inject SharedPreferences sharedPreferences;

public void onCreate(Bundle savedInstance) { // assign singleton instances to fields InjectorClass.inject(this); } 复杂的依赖关系只需要简单的配置 Dagger2 会通过依赖关系并且生成易懂易分析的代码。以前通过手写的大量模板代码中的对象引用将会由它给你创建并传递到相应对象中。因此你可以更多的关注模块中构建的内容而不是模块中的对象实例的创建顺序。

让单元测试和集成测试更加方便 因为依赖关系已经为我们独立出来,所以我们可以轻松的抽取出不同的模块进行测试。依赖的注入和配置独立于组件之外。因为对象是在一个独立、不耦合的地方初始化,所以当注入抽象方法的时候,我们只需要修改对象的实现方法,而不用大改代码库。依赖可以注入到一个组件中:我们可以注入这些依赖的模拟实现,这样使得测试更加简单。 作用域实例(Scoped instances) 我们不仅可以轻松的管理全局实例对象,也可以使用Dagger2中的scope定义不同的作用域。(比如根据user session,activity的生命周期) 原文链接:http://www.jianshu.com/p/01d3c014b0b1