你的位置:首页 > 软件开发 > 操作系统 > 浅析Dragger2依赖注入实现过程

浅析Dragger2依赖注入实现过程

发布时间:2017-06-23 12:00:21
Dragger2是Android应用开发中一个非常优秀的依赖注入框架。本文主要通过结合Google给出的MVP开发案例todo-mvp-dagger(GitHub连接地址:https://github.com/googlesamples/android-architecture/ ...

浅析Dragger2依赖注入实现过程

  Dragger2是Android应用开发中一个非常优秀的依赖注入框架。本文主要通过结合Google给出的MVP开发案例todo-mvp-dagger(GitHub连接地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger/),简要分析一下Dragger2的依赖注入实现过程。

  如果是刚入手学习Dragger2,这里推荐三篇非常不错的连载文章:http://www.jianshu.com/p/cd2c1c9f68d4,这三篇文章写得非常用心,而且思路清晰,生动有趣,容易理解。

  todo-mvp-dagger在功能上划分为addedittask,statistics,taskdetail,tasks四个模块,由于每个模块除了功能逻辑不同之外,实现方式相差不大,所以我就只分析其中的tasks模块,其它模块可参照此模块的分析流程来分析。

  Dragger2的依赖注入是通过Java注解的方式来实现的。Dragger2中提供了@Inject,@Component,@Module,@Provides等一系列注解,通过注解,Dragger2能够在程序编译阶段利用程序员创建的Java文件,按照编译模板自动生成对应的.class辅助文件,在这些.class辅助文件中会有相应代码来自动完成依赖对象的创建。Dragger2正是以此种看似自动化的技术手段来代替手动new对象的过程。如下图,红色框中的.class文件就是Tasks模块在编译过后自动生成的.class辅助文件。

浅析Dragger2依赖注入实现过程

  其实,现在有很多框架都利用了注解的方式,通过在编译阶段生成相应的.class文件来完成依赖注入或者其它某些操作,如阿里已经开源的路由框架ARouter。

  那Dragger2的依赖注入究竟是怎样的一个过程呢?我们先来看TasksActivity。下面是TasksActivity的部分代码。

浅析Dragger2依赖注入实现过程

  TasksActivity中依赖了一个对象:mTasksPresenter。mTasksPresenter用@Inject标注,表示在TasksActivity实例化时,mTasksPresenter需要被自动创建,然后注入到TasksActivity实例当中去。此时,我们可能会想,是不是用@Inject标注一下就实现依赖注入了?其实不然。我们看到上图下方的红色框中有一段代码,这段代码很长,因为DaggerTasksComponent这个类中使用了Builder模式,只要稍微拆分一下明白了,其实这段代码就做了一件事情,就是调用了TasksComponent的inject()方法,而这里才是mTasksPresenter真正被实例化的地方。

  我们再来看TasksComponent,这是一个很简单的接口,里面声明了一个inject(TasksActivity activity)方法:

 1 package com.example.android.architecture.blueprints.todoapp.tasks; 2  3 import com.example.android.architecture.blueprints.todoapp.ToDoApplication; 4 import com.example.android.architecture.blueprints.todoapp.data.source.TasksRepositoryComponent; 5 import com.example.android.architecture.blueprints.todoapp.util.FragmentScoped; 6  7 import dagger.Component; 8  9 /**10  * This is a Dagger component. Refer to {@link ToDoApplication} for the list of Dagger components11  * used in this application.12  * <P>13  * Because this component depends on the {@link TasksRepositoryComponent}, which is a singleton, a14  * scope must be specified. All fragment components use a custom scope for this purpose.15 */16 @FragmentScoped17 @Component(dependencies = TasksRepositoryComponent.class, modules = TasksPresenterModule.class)18 public interface TasksComponent {19   20   void inject(TasksActivity activity);21 22 }

原标题:浅析Dragger2依赖注入实现过程

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录