dagger2专题1:为什么要使用dagger

想知道为什么要使用dagger,那我们先要了解dagger是什么,解决了什么问题。

dagger是什么?

dagger早期是由square公司开发并维护的一个框架,square公司维护期间的版本号为1.x。后来,由google接手进行后续的开发和维护,版本号也变为2.x,也就是我们目前使用的dagger2。dagger2相较于dagger1有不少的改动,这些改动也让dagger2相对于dagger1来说效率更高。

dagger解决了什么问题?

简单的说,dagger解决了依赖注入的问题。

  • 那什么是依赖呢?

举个例子:

public class Artist {
    private Paint mPaint;
    private Paper mPaper;
    
    ...
}

这里有一个Artist类,它里面引入了两个类:Paint 和Paper ,这种关系可以说是Artist依赖于Paint和Paper ,也就是说,Paint和Paper 是Artist的依赖。
如果这里我们要使用Paint 和Paper,就必须先实例化这里两个对象,那我们一般是怎么样实例化的呢?

  • 依赖实例化
  1. 直接在类里new
public class Artist {
    private Paint mPaint = new Paint();
    private Paper mPaper = new Paper();

    ...
}
  1. 在构造函数中传值
public class Artist {
    private Paint mPaint;
    private Paper mPaper;

    public Artist(Paint mPaint, Paper mPaper) {
        this.mPaint = mPaint;
        this.mPaper = mPaper;
    }
}
  1. 通过set方法赋值
public class Artist {
    private Paint mPaint;
    private Paper mPaper;

    public void setPaint(Paint mPaint) {
        this.mPaint = mPaint;
    }

    public void setPaper(Paper mPaper) {
        this.mPaper = mPaper;
    }
}

这是 我们以往用得比较多的三种方法,有什么问题吗?对于方法1来说,如果Paint 和Paper 需要设置的属性比较多,将导致Artist的实例化代码相当繁杂,像这样

        Artist artist = new Artist();
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setSize(16);
        artist.setPaint(paint);

        Paper paper = new Paper();
        paper.setWidth(600);
        paper.setHeight(300);
        paper.setColor(Color.WHITE);
        artist.setPaper(paper);

其实在这里我们只想得到一个Paint和Paper实例化对象,至于它的实例化过程和设置是否可以交给第三方去集中实例化?这就是dagger解决的问题了,帮助用户集中创建 依赖,并注入到需要它的地方。下一章我们将讲dagger怎样帮助我们构建依赖并注入到需要它的地方。

你可能感兴趣的:(dagger2专题1:为什么要使用dagger)