Dagger2简介

一、简介

Dagger2起源于Dagger,是一款基于Java注解来实现的完全在编译阶段完成依赖注入的开源库,主要用于模块间解耦、提高代码的健壮性和可维护性。Dagger2在编译阶段通过apt利用Java注解自动生成Java代码,然后结合手写的代码来自动帮我们完成依赖注入的工作。

二、依赖注入(Dependency Injection简称DI

public class Person {
private Food food;

public Person() {
food = new Food();
}
}
像这样Person类持有对Food实例的引用,我们称之为Person类对Food类有依赖。二依赖注入则是通过注入的方式实现类与类之间的依赖。

这里只展示Dagger2如何实现类与类之间的依赖

public class Person{
@Inject
Food food;

public Car(){

}
}

三、Dagger2注解

Dagger2使用过程中我们通常用到的注解主要包括:@Inject, @Module, @Provides, @Component, @Qulifier, @Scope, @Singleten。

1. @Inject:它有两个作用,一是用来标记需要依赖的变量,以此告诉Dagger2来为它提供依赖。

二是标记构造函数,通过一中被标记的变量来找到对应构造函数并把改实例构造出来,可以说是为@Inject标记的变量提供依赖。


2.@Module:它的作用和Inject的第一个作用一样,也是为被@Inject(第一个作用)标记的变量提供依赖,但是@Inject(第二个作用)的作用只能作用在构造函数上,当我们引入第三方库的时候,我们不能在它类库里的类的构造函数上加@Inject(第二个作用)标记。又或者,我们的类中的构造函数中需要的参数是第三方库的,那么我们可以通过Module来为被@Inject(第二个作用)的构造函数提供它所需实例化时需要的参数。


3.@Provides:它是用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用。被它标注的方法,在编译时会生产对应的Factory,它提供了get方法来获取所需实例对象。


4.@Component:它是注入器,作为依赖需求方和依赖提供方之间的桥梁。被Component标注的接口在编译时会生产该接口的实现类(比如它标注的接口是MainComponent,那么编译时生产的实现类就为DaggerMainComponent),我们可以通过这个类,完成注入。


5.@Qulifier:它是用于自定义注解,就这么说,当我们需要一个User时,可以用@Module来标注提供依赖的方法时,Dagger2如何判断这个方法为谁提供依赖?没错那就是返回值类型。Dagger2根据返回的类型来决定哪个被@Inject的标记的变量赋值,。那么问题又来了,如果有两个提供依赖的方法,如有两个@Provide标注都是返回User,这时Dagger2就傻了,所以@Qulifier的存在就是为了解决这个问题。在提供依赖的方法(也就是被@Provide标注的方法)上标注@Qulifier,当然所需依赖方(@Inject标记)的变量上也要添加相应的@Qulifier标注,这样就能正确的注入了。


6.@Scop:@Scope同样用于自定义注解,我们可以通过@Scope自定义的注解来限定注解作用域,实现局部的单例;


7.@Singleton:@Singleton其实就是一个通过@Scope定义的注解,我们一般通过它来实现全局单例。但实际上它并不能提前全局单例,是否能提供全局单例还要取决于对应的Component是否为一个全局对象。一般而言,全局的单例是AppCompnent,而其他的Component最好给他们提供各自的@Scope。


关于@Inject和@Module提供依赖的顺序。当构造函数上即有@Inject标记,又有@Module提供依赖。这时Dagger2会先从@Module标注的类中找,如果没有再去@Inject标注的构造方法上实例化,当依赖方法存在参数时,还是会先去@Module标注的类中找,没有在去@Inject,一直这么循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值