第一篇中介绍的案例,有一个局限性,就是 @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的实例化。
这个时候你在回过头来看,其实和上一篇文章分析的流程基本上一致。
下篇我们会分析更高级的一点的用法
网友评论