本文就记录本人学习Dagger2时的一些问题或者理解。
至于关于Dagger2是什么啊,做什么用的啊,巴拉巴拉。我就不在此赘述了。
不过得吐槽一句,由于本人英文不是很好,在没有任何该知识基础的情况看英文文档很吃力,所以不得不看国内的相关博客,不过最开始找了好久,很多看起来都没有感觉,其内容泛泛而谈,缺少源码实例。(当然了,这纯属吐槽,毕竟有些博客也是别人自己一字一字码出来的)。
最开始入门时,有幸发现了一篇很赞的文章,学习完之后也算是入门了。(学习自:使用Dagger 2进行依赖注入)
这篇文章里面就Dagger2中的@Module
、@Provides
、@Component
三个注释的使用举出了通俗易懂的源码实例,让人一看就能对此有了直观的了解。
好了,在开始使用dagger2之前呢,需要先配置好Gradle,这里可以参观官方的,是最准确的。
另外,可能还需要在module的build.gradle下添加如下依赖,否则会在编译报错,如下图:
compile 'javax.annotation:javax.annotation-api:1.2'
(也许是跟下图中配置的版本有关,这点我没有深究了)
接着,就可以跟着文章撸代码了。(可以在这里直接clone我的,为了直观的了解,我将自己撸的示例分成了test1、test2两部分,即分别对应文中的简单的依赖注入
与多层依赖
)
准备好之后,我就得注入一点自己的观点或者理解了。
1、在简单的依赖注入中,需要在MainActivity
中注入一个UserModel
的实例,首先就需要一个依赖模块,为了直观,我命名成了MainActivityMoudle
(被@Module
标识了),里面就有一个被@Provides
标识的方法provideUserModel()
,该方法返回一个目标实例,当然了,这个方法名是可以随便命名的,只要符合Java的命名规则即可,但是一定得有@Provides
标识。
2、接着就需要一个“注入器”(即Injector,但是在Dagger2中,将其称为Component。)将实例注入到指定的依赖中(在本例中即MainActivity)。在构建Injecyor时的注意事项在文中已经说得很清楚了,我就不再复述,只是提醒大家一定得注意了。 我在这里要说的是,注入方法inject()
的方法名也是可以自定义的,只需要在调用的时候调用正确的方法名即可。
3、在注入时,会用到Dagger自动生成的相应的Component类(在使用前一定要将项目ReBuild一遍,才会生成该类),在我的Demo中为DaggerMainActivityComponent
(因为我在构建Injector为MainActivityComponent
)。在这里,就可以很直观的看到命名规律:Dagger+定义的Component名
。还有在builder()
方法后链式引用了mainActivityModule()
方法,其参数就是相应的Module
,这里的mainActivityModule()
方法的命名也是有规律的,即对应的Module
名,首字母小写即可。
4、被注入的实例的引用需要用@Inject
标识,且不能为private,并@Inject
不能标识局域变量。需要多少个实例,就用@Inject
表示相应数量的引用变量即可。
5、至于多层依赖,也比较容易理解,只要解读一下文章与实例代码即可。
但是要注意,在多层依赖时,因为使用了MainActivityComponent
作为低级Component来提供依赖,原本MainActivityComponent
中的inject()
方法需要去掉,注意,是去掉,而不是与UserModel userModel()
共存,否则是无法ReBuild的。