美文网首页
dagger2源码简析

dagger2源码简析

作者: 好大一只龍 | 来源:发表于2017-11-13 18:54 被阅读12次

介绍

关于dagger github上是这样介绍的。

A fast dependency injector for Android and Java.
Android和Java的快速依赖注入器。

栗子

dagger2有很多用法,本文用最一个简单的使用方法所生成的源码来进行剖析。首先把我们的栗子代码贴出来:

public class Persion {
    public void sayHello(){
        System.out.println("hello");
    }
}

@Module
public class PersionModule {
    @Provides
    public Persion providePersion(){
        return new Persion();
    }
}

@Component(modules = PersionModule.class)
public interface HelloActivityComponent {
    void inject(HelloDaggerActivity activity);
}

public class HelloDaggerActivity extends Activity {
    @Inject
    Persion mPersion;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DaggerHelloActivityComponent.create().inject(this);
        setContentView(R.layout.activity_hello);
        mPersion.sayHello();
    }
}

源码简析

接下来编译,来看apt生成的三个文件:


dagger生成文件.png

我们从DaggerHelloActivityComponent.create().inject(this);注入依赖的方法口入开始分析。DaggerHelloActivityComponent代码如下:

public final class DaggerHelloActivityComponent implements HelloActivityComponent {
  private PersionModule persionModule;

  private DaggerHelloActivityComponent(Builder builder) {
    initialize(builder); //4
  }

  public static Builder builder() {
    return new Builder();
  }

  public static HelloActivityComponent create() {
    return new Builder().build(); //1
  }

  @SuppressWarnings("unchecked")
  private void initialize(final Builder builder) {
    this.persionModule = builder.persionModule; //5
  }

  @Override
  public void inject(HelloDaggerActivity activity) {
    injectHelloDaggerActivity(activity);//6
  }

  private HelloDaggerActivity injectHelloDaggerActivity(HelloDaggerActivity instance) {
    HelloDaggerActivity_MembersInjector.injectMPersion(//7
        instance,
        Preconditions.checkNotNull(
            persionModule.providePersion(),
            "Cannot return null from a non-@Nullable @Provides method"));
    return instance;
  }

  public static final class Builder {
    private PersionModule persionModule;

    private Builder() {}

    public HelloActivityComponent build() {
      if (persionModule == null) {
        this.persionModule = new PersionModule();//2
      }
      return new DaggerHelloActivityComponent(this);//3
    }

    public Builder persionModule(PersionModule persionModule) {
      this.persionModule = Preconditions.checkNotNull(persionModule);
      return this;
    }
  }
}

注释1create方法调用了new Builder().build();这个建造者方法。注释2中可以看到这个建造者方法创建了我们提供的PersionModule类的对象,并在注释3中返回了DaggerHelloActivityComponent类对象传入了当前builder对象。注释4的构造方法执行了initialize ()初始化方法,然后在注释5中初始化了module对象为builder中创建的module对象。接下来执行注释6inject()然后执行到到注释7injectHelloDaggerActivity()方法HelloDaggerActivity_MembersInjector.injectMPersion( instance, Preconditions.checkNotNull( persionModule.providePersion(), "Cannot return null from a non-@Nullable @Provides method"));
此处执行HelloDaggerActivity_MembersInjector.injectMPersion ()方法,传入了两个参数,一个instance我们的需要被注入依赖的目标类HelloDaggerActivity对象,另外一个是persionModule.providePersion()方法也就是我们编写的PersionModule类返回new Persion()

贴上HelloDaggerActivity_MembersInjector类源码如下:

public final class HelloDaggerActivity_MembersInjector
    implements MembersInjector<HelloDaggerActivity> {
  private final Provider<Persion> mPersionProvider;

  public HelloDaggerActivity_MembersInjector(Provider<Persion> mPersionProvider) {
    this.mPersionProvider = mPersionProvider;
  }

  public static MembersInjector<HelloDaggerActivity> create(Provider<Persion> mPersionProvider) {
    return new HelloDaggerActivity_MembersInjector(mPersionProvider);
  }

  @Override
  public void injectMembers(HelloDaggerActivity instance) {
    injectMPersion(instance, mPersionProvider.get());
  }

  public static void injectMPersion(HelloDaggerActivity instance, Persion mPersion) {
    instance.mPersion = mPersion; //1
  }
}

此处注释1中将persion对象设置到activity中。至此我们HelloDaggerActivity所依赖的mPersion对象就注入到了目标类HelloDaggerActivity中。终于可以愉快的玩耍了~~~

相关文章

  • mybatis-spring解析

    1、概述 原生Mybatis源码简析(上)原生Mybatis源码简析(下)在介绍原生Mybatis源码简析文章中,...

  • dagger2源码简析

    介绍 关于dagger github上是这样介绍的。 A fast dependency injector for...

  • Dagger2 源码简析

    Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担。我们去看看Dagger2 是如...

  • Flink自定义StreamOperator

    在上一篇StreamOperator源码简析从源码角度分析了StreamOperator以及其实现类,此篇幅主要分...

  • OkHttp源码简析

    Android平台有很多优秀的开源库,OkHttp绝对是其中的佼佼者,它是Square出品的一个网络通讯库,功能强...

  • HashMap源码简析

    说到HashMap相信大家并不陌生,这是一个非常常用的以键值对形式存储的数据结构,但是对其内部原理可能不是很了解,...

  • Handler源码简析

    消息------Message 消息的复用:Message.obtain() public static M...

  • Mask源码简析

    版本 源码版本:2017.3.0 着色器版本:2017.3.0 Mask使用方法 https://jingyan....

  • Wax源码简析

    阅读的是阿里维护的Wax版本 先针对如下用法的实现过程进行讲解。 用法 用法讲解 详细的Wax用法讲解,请参阅ht...

  • Mybatis源码简析

    本文将按mybatis中主要数据库查询操作的流程对其源码进行简单分析。目录如下: 1、mybatis的主要工作流程...

网友评论

      本文标题:dagger2源码简析

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