美文网首页dagger2入门到不放弃
Dagger2使用与分析(2)--Module,provides

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

作者: saygoodbye_e92e | 来源:发表于2019-04-02 18:56 被阅读9次

    第一篇中介绍的案例,有一个局限性,就是 @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的实例化。

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

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

    相关文章

      网友评论

        本文标题:Dagger2使用与分析(2)--Module,provides

        本文链接:https://www.haomeiwen.com/subject/dgegbqtx.html