不带参数的 Inject
1.将需要注入的对象的构造用@Inject标注 (告知dagger此对象可以实例化)
2.编写Component接口使用@Component标注,里面的void Inject(目标位置)
3.编译项目,自动生成Component生成的类,名字:Dagger+自定义Component的类名
4.在需要注入的类中使用@Inject注入变量,调用自动生成的Component类方法create()或者builder().build。然后inject(this)。此时就可以使用注入进来的对象了
带构造参数的对象Inject
二、带MOdule的Inject方式(主要用于引入第三方库,别人写的代码)
1.编写Module类并使用@Module标注此类,编写方法返回值为我们需要inject的类型并使用@Provides标注这个方法
2.编写Component接口,使用@Component标注这个接口,并使用modules=的方法链接上一步中的Module类
3.编译项目,自动生成Component生成的类,名字:Dagger+自定义Component的类名
4.在需要注入的类中使用@Inject注入变量,调用自动生成的Component类方法create()或者builder().build。然后inject(this)。此时就可以使用注入进来的对象了
二(1)复杂Module使用()只改Module类
三、Component 依赖Component (类似extends)
a、dependence实现:
1.父Component要显式写出要暴露可提供给子Component的依赖
2.子Component在注解中使用dependencies= 来链接父Component
3.注意子Component的实例化。
b 、SubComponent方式
1.先定义子Component,使用@SubComponent标注
2.父Component中定义获得子Component的方法
3.注意子Component实例化方式。
总结
在使用dagger2的过程中,在定义一些类或方法的名字的时候,要遵守一些谷歌提出的固定标准,以方便代码阅读与维护:
1、定义的Component和Module的名字是无所谓的,但是一般遵照以Component或Module结尾的名称;
2、Module中用@Provides标注的方法的方法名是无所谓的,返回值是最重要的,但是一般遵照以provide开头的方法名;
3、Component中返回值为void且有参的方法,方法名是无所谓的,参数是最重要的代表的是要注入的目标位置,但是方法名一般为inject;
4、Component中返回值不为void且无参的方法,方法名是无所谓的,返回值是最重要的代表的是暴露给子Component使用的依赖或者是获取的子Component的类型。
网友评论