Android Dagger2 初学笔记

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);

这里引入一张图

Android Dagger2 初学笔记_第1张图片

(先抛开 Application 不讲)

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

Module

负责实例化Presenter类(@Provides

构造函数在Activity中传参

将自身提供给Component

Component

规定作用域

依赖Module

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

Activity

定义Presenter时加一个@Inject注解

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

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

Presenter被实例化

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

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

示例

实例化

MyModule

@Module
public 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,日后再研究

你可能感兴趣的:(Android,学习笔记)