Google官方MVP+Dagger2架构详解【从零开始搭建android框架系列(6)】
参考文章:Dagger2 使用详解
(1). @Inject 和 @Provide 两种依赖生成方式区别
a. @Inject 用于注入可实例化的类,@Provides 可用于注入所有类
b. @Inject 可用于修饰属性、构造器和一般方法,可用于任何非 Module 类,@Provides 只可用于用于修饰非构造函数,并且该函数必须在某个Module内部
c. 假如一个类中@Inject 同时修饰了构造器和一般函数方法,则一般函数方法会在构造器执行完以后立即执行,可用于做一些初始化的工作,@Provides 修饰的函数必须以 provide 开头
(2)@Module
有时候我们并不能直接在构造函数里面添加@Inject注解,或者类中存在多个构造函数时,@Inject也只能注解其中一个构造函数,不能注解多个构造函数,这里是会产生歧义性,因为Dagger2无法确认调用哪一个构造函数来生成例的实例对象。另外一种情况是我们在项目中引用第三方类库时,也是无法直接在类构造函数中添加@Inject注解的,所以我们需要用到@Module注解了。
@Module是用来生产实例来注入对象的,它类似一个工厂,集中创建要注入的类的对象实例。下面我们引用一下Gson库来看看@Module是怎么使用的,创建MainModule类:
/*
@Module注解表示这个类提供生成一些实例用于注入
*/
@Module
public class MainModule {
/**
* @Provides 注解表示这个方法是用来创建某个实例对象的,这里我们创建返回Gson对象
* 方法名随便,一般用provideXXX结构
* @return 返回注入对象
*/
@Provides
public Gson provideGson(){
return new Gson();
}
}
(3)@Module的优先级高于@Inject。
Dagger2 使用详解
细心的同学就会发现了,我们提供了两个可以生成Poetry实例的方法,一个是在Poetry类的构造函数时候用@Inject提供的实例创建方法,一个是在PoetryModule中的@Privodes注解的providePoetry方法,而在上面的运行结果中我们发现是调用了PoetryModule提供的方法,这里就要说明一下优先级的问题,在上面这种既在构造函数中用@Inject提供注入来源,也在@Module中用@Privodes注解提供注入来源的,Dagger2是先从@Privodes查找类实例,如果找到了就用@Module提供的方法来创建类实例,如果没有就从构造函数里用@Inject注解的生成类实例,如果二者都没有,则报错,简而言之,就是@Module的优先级高于@Inject。
另外这里还要说明一点,在providePoetry(String)方法中,String这个参数也是要注入提供的,必须也要有在同一个连接器里面有提供,其中在构建类实例的时候,会按照以下顺序执行:
从Module中查找类实例创建方法
Module中存在创建方法,则看此创建方法有没有参数
如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例
如果无参数,则直接由这个方法生成最终类实例
Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数
如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例
如果该构造函数无参数,则直接调用该构造函数生成类实例
以上就是一次注入生成类实例的生成步骤。
(4)学习Dagger2过程中碰见的其他可以学习的文章
Dagger2 使用详解
Dagger 2: Step To Step
详解Dagger2
googlesamples/android-architecture