您的位置:首页 > 移动开发 > Android开发

Dagger 笔记 一

2016-03-20 12:48 423 查看
最近一段时间在学习dagger这个框架,把自己一些理解和笔记记录下来。

class A 中 需要class B中的事例 B是A的依赖

class A{
B b;
public A ( B b ){
this.b = b;
}
}


上例就是所谓的依赖注入,将b对象注入到A中 dagger框架获取注入对象实例的时候会去寻找 @Inject修饰的构造函数 或者@Provides 修饰的函数

还是上例

class A{
@Inject B b; //告诉dagger这个地方需要被注入
}


在合适的位置调用ObjectGraph.inject()函数,dagger就会自动调用B的生成方法来生成依赖的实例

ObjectGraph是一个dagger自身的一个依赖管理类,create的参数是一个数组,数组里面是所有需要用到的Module

@Module(injects = A.class)
public class AppModule {
}


上例我们声明了一个模块,用@Module声明,Module的作用是提供信息,让ObjectGraph知道哪些对象需要被依赖注入,上例中A需要被依赖注入, inject声明了需要被依赖注入的类是A

@Inject可用于修饰属性和构造方法,可实例化的类,并且修饰的函数只能是构造函数,

@Provides 只能用于@Module修饰的类并且不能用于修饰构造函数,修饰的函数必须以provide开头

@Singleton 注解单例 依赖的对象只能被初始化一次,之后每次使用都会被注入相同的对象

注解单例有两种模式

一:注解构造函数的单例模式

@Singleton
class B{
@Inject
public b(){}
}


二:注解函数的单例模式

@Provieds@Singleton [函数]

Qualifier(限定符)

有程序员这个类。类中有两类程序员人,他们的能力值 power 分别是 5 和 1000,dagger怎么对他们做出区分,这时候就可以用@Qualifier 注解

(1). 创建一个 @Qualifier 注解,用于区分两类程序员:

@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Level {
String value() default "";//能力值
}


(2). 为这两类程序员分别设置 @Provides 函数,并使用 @Qualifier 注解对他们做出不同的标记:

@Provides @Level("low") Coder provideLowLevelCoder() {
Coder coder = new Coder();
coder.setName("战五渣");
coder.setPower(5);
return coder;
}
@Provides @Level("high") Coder provideHighLevelCoder() {
Coder coder = new Coder();
coder.setName("大神");
coder.setPower(1000);
return coder;
}


(3). 在声明 @Inject 对象的时候,加上对应的 @Qualifier 注解。

@Inject @Level(“low”) Coder lowLevelCoder;//注入能力5的对象实例

@Inject @Level(“high”) Coder highLevelCoder;//注入能力1000 的对象实例

注意:

(1). 所有需要依赖注入的类,需要被显式声明在相应的Module中。

(2). 一个Module中所有 @Provides 函数的参数都必须在这个 Module 中提供相应的被 @Provides 修饰的函数(这里是指@Provides修饰的函数中带有参数,参数是别的class的对象实例,生成该对象实例必须在该Module中并且被@Provides修饰),或者在 @Module 注解后添加 “complete = false” 注明这是一个不完整 Module,表示它依赖不属于这个 Module 的其他 Denpendency。

(3). 一个Module中所有的 @Provides 函数都要被它声明的注入对象所使用,或者在 @Module 注解后添加 “library = ture” 注明它含有对外的 Denpendency,可能被其他Module依赖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 Android