如何在我的项目中使用Dagger以及使用它的目的是什么?我在谷歌搜索它但我不清楚它。如果可能的话,请给我最好的解决方案和一个例子。
答案 0 :(得分:13)
许多Android应用程序依赖于实例化通常需要其他依赖项的对象。例如,可以使用诸如Retrofit之类的网络库来构建Twitter API客户端。要使用此库,您可能还需要添加解析库,例如Gson。此外,实现身份验证或缓存的类可能需要访问共享首选项或其他常见存储,需要首先实例化它们并创建固有的依赖关系链。
Dagger 2为您分析这些依赖关系并生成代码以帮助将它们连接在一起。虽然还有其他Java依赖注入框架,但其中许多框架在依赖XML时遇到了限制,需要在运行时验证依赖性问题,或者在启动期间导致性能损失。 Dagger 2完全依赖于使用Java注释处理器和编译时检查来分析和验证依赖关系。它被认为是迄今为止构建的最有效的依赖注入框架之一。
优点
以下列出了使用Dagger 2的其他优点:
简化对共享实例的访问。正如ButterKnife库更容易定义对Views,事件处理程序和资源的引用一样,Dagger 2提供了一种获取对共享实例的引用的简单方法。例如,一旦我们在Dagger中声明我们的单例实例,例如MyTwitterApiClient或SharedPreferences,我们就可以使用简单的@Inject注释声明字段:
public class MainActivity extends Activity {
@Inject MyTwitterApiClient mTwitterApiClient;
@Inject SharedPreferences sharedPreferences;
public void onCreate(Bundle savedInstance) {
// assign singleton instances to fields
InjectorClass.inject(this);
}
}
轻松配置复杂的依赖项。存在一个隐式顺序,通常会在其中创建对象。 Dagger 2遍历依赖图并生成易于理解和跟踪的代码,同时还可以避免编写大量样板代码,通常需要手动编写以获取引用并将它们作为依赖项传递给其他对象。它还有助于简化重构,因为您可以专注于要构建的模块,而不是关注它们需要创建的顺序。
更简单的单元和集成测试因为依赖图是为我们创建的,所以我们可以轻松地交换出网络响应的模块并模拟这种行为。
范围实例您不仅可以轻松管理可以持续整个应用程序生命周期的实例,还可以利用Dagger 2来定义寿命较短的实例(即绑定到用户会话,活动生命周期等)。