Android Dagger 2 初学笔记

  • Android Dagger 2 初学笔记
    • 前言
    • 简介
      • Module
      • Component
      • Activity
    • 示例
      • 实例化
      • 添加依赖
      • 注入
    • 总结

前言

看了大部分的 Dagger 2 教程博客,大多都说的几点功能:

  • 模块间解耦,提高代码的健壮性和可维护性
  • 访问全局对象的实例方式更简单
  • 方便进行测试
  • 方便管理作用域

由于初学Android,对解耦测试作用域了解不是很深入,目前并没有用到相关内容,所以现在只了解清楚了它实例化对象的过程

本文就笔者实现基本的Dagger 2 依赖注入功能做一些记录

日后若有用到其他强大功能,再做记录说明(肯定会用到其他功能的)

直接结合MVP框架进行示例

简介

依赖注入 ( Dependency Injection简称 di ) 不做说明

在这里我将用框架实现Presenter类在Activity中的实例化

MVP初学笔记中的实现方法:

mPresenter = new MyPresenter(this);

这里引入一张图

(先抛开 Application 不讲)

由三部分组成:Module + Component + Activity

Module

负责实例化Presenter类(@Provides

构造函数在Activity中传参

将自身提供给Component

Component

规定作用域

依赖Module

定义注入方法,参数为目标类

Activity

定义Presenter时加一个@Inject注解

通过DaggerXXComponent.builder().Module()完成对Module的构造

通过DaggerXXComponent.inject(this)完成注入

Presenter被实例化

看起来比原来的new方法来的复杂的多呀。。。

还有一些注解的使用在下文简单说明

示例

实例化

MyModule

@Modulepublic class MyModule {    private Context mContext;    /**     * 构建MyModule时,将Context传进来     * @param mContext 这里指MyActivity     */    public MyModule(Context mContext) {        this.mContext=mContext;    }    @Singleton    @Provides    MyPresenter providerMyPresenter(){        return new MyPresenter(mContext);    }}

Module类一定要有@Module注解

返回实例化的方法上要有@Provides注解,方法名一般为provideXXPresenter()

@Singleton的理解还不够清晰,日后再做解释

添加依赖

MyComponent

@Singleton@Component(modules = MyModule.class)public interface MyComponent {    void inject(MyActivity activity);}

Component类一定要有@Component注解,并且参数 modules 设置为要添加的Module

这里定义注入方法(一般为)inject,参数为Activity

下面要做的就是在Activity类中调用这个方法实现注入(实例化)

注入

MyActivity

public class MyActivity extends AppCompatActivity implements MyView{  ImageView helloIv;  @Inject  MyPresenter mPresenter;//在MyModule中provide的实例  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_my);    helloIv=findViewById(R.id.iv_helloimg);    //Dagger注入 实例化    DaggerMyComponent.builder()      .myModule(new MyModule(this))      .build()      .inject(this);    mPresenter.onCreate();    mPresenter.attachView(this);//绑定View并且实现方法    //mPresenter.getImage();    //TODO  }

在要实例化的类 定义时添加注解@Inject

完成之前的Module以及Component的创建后,build操作一下,框架会自动生成一个DaggerXXXComponent类(这里是DaggerMyComponent

  • Module类进行传参构造(参数实际上为Presenter服务)

    .builder().myModule(new MyModule(this)).build()
  • 实现注入(调用inject()方法)

    .inject(this)

到这里就算是完成了整个过程,之后就可以直接使用@Inject注解定义的实体(Presenter)了

总结

这里只是一种比较基础(小白)的 Dagger 2 实现的方式

观察Google官方代码的话,应该有更具体(牛逼)的方式实现

一般Dagger 2与MVP结合使用

(Google的Demo是真的很到位)

Google Android MVP + Dagger 2 Demo

学习过程中看过的博客:

  • Google官方MVP + Dagger2架构讲解
  • Android快速依赖注入框架Dagger2使用1 这个博主有很多Android相关文章,都还不错

好像还有一个Dagger 2应用于Android的完美扩展库dagger.android,日后再研究

更多相关文章

  1. Android菜单Menu的创建
  2. Android两种序列化方式详解(一):Serializable
  3. Android(安卓)使用Parcelable序列化对象
  4. [置顶] 我的Android进阶之旅------>Android实现数据存储技术
  5. Android(安卓)SQLite总结[转载]
  6. Android(安卓)Service的启动流程源码分析(8.0)
  7. Android应用程序组件Content Provider应用实例
  8. android 设定activity的进入和退出效果
  9. Android之service一些基础回顾

随机推荐

  1. H5页面调用android方法传json格式
  2. Android之Adapter用法总结
  3. android 修改标题栏文字居中
  4. Android(安卓)学习笔记7---数据存储与访
  5. Android(安卓)IPC进程通信——Messager方
  6. Ubuntu连接Android真机调试
  7. Android入门:单元测试
  8. 从零开始搭建Android(安卓)MVP架构
  9. Android(安卓)系统调试接口
  10. android RelativeLayout 适用场景和属性