dagger2入门到不放弃

Dagger2使用与分析(2)--Module,provides

2019-04-02  本文已影响9人  saygoodbye_e92e

第一篇中介绍的案例,有一个局限性,就是 @Inject 必须要修饰一个类的构造方法,若我们是应用的第三方工具包,我们是无法修改其源码的,这时候我们可以用 @Module 、@Provides来帮忙。

第一步,用 @Module 声明一个类,代表这个类是拥有对外提供实例的功能。

如:被依赖类如下:

被依赖的实体类

此处用来模拟第三方类,假设该类的构造函数我们无法添加@Inject的注解

自定义module类

第二步,用 @Provides 修饰一个方法,该方法返回具体的实例对象。

如上图所示:

第三步,修改用 @Component 修饰的 interface,指定其需要的 Module 模块。

自定义Component

使用:

使用案例

查看生成的文件

分析开始如下:

还是从DaggerPersonComponent.create().inject(this);入手

进入生成文件 DaggerPersonComponent类中可以发现

create()---->new Builder().build()---->new DaggerPersonComponent(this)

--------->initialize(builder);

进入initialize(builder)这个函数的内部

生成文件01

完成了 getPersonProvider和 mainActivityMembersInjector这两个成员变量的赋值

接下来就是inject(MainActivity activity)这个方法了,

mainActivityMembersInjector.injectMembers(activity);

----->那么进入MainActivity_MembersInjector.create(getPersonProvider);

-------------->MainActivity_MembersInjector这个生成文件中

查看代码如下:

生成文件02

发现,create函数就是实例化MainActivity_MembersInjector这个类,injectMembers(MainActivity instance)这个函数不正是生成文件01图中的对应的injectMembers吗,然后

--------------->instance.mPerson =mPersonProvider.get();将MainActivity中的person成员变量赋值成功

而mPersonProvider--->

public MainActivity_MembersInjector(Provider mPersonProvider) {

            assert mPersonProvider !=null;

          this.mPersonProvider = mPersonProvider;

}

通过构造函数赋值的,而构造函数又是在create函数中调用的

---->会看生成文件01 ,可以发现getPersonProvider----->

this.getPersonProvider = PersonModule_GetPersonFactory.create(builder.personModule);

进入PersonModule_GetPersonFactory文件中查看如下:

生成文件003

发现 create(PersonModule module)

---------------->调用对应的构造函数,后构造函数中对 this.module = module;

然后会看生成文件001中

this.getPersonProvider = PersonModule_GetPersonFactory.create(builder.personModule);

builder.personModule就是上面对应的create(PersonModule module)中的参数值

builder.personModule

---->

生成文件04

完成PersonModule的实例化。

这个时候你在回过头来看,其实和上一篇文章分析的流程基本上一致。

下篇我们会分析更高级的一点的用法

上一篇 下一篇

猜你喜欢

热点阅读