返回

Dagger2:Scope, Component间依赖和subComponent, 你的编程小帮手!

Android

引言

在上一篇文章中,我们接触到了Dagger2的基本用法。然而在实际Android开发当中,还会有更进一步的需求:需要有多个不同生命周期的多个Component,例如,有些依赖图是全局单例的,而有些依赖图会根据Activity、Fragment或者其他粒度的生命周期而变化。此外,在复杂项目当中,如果每个Component之间的依赖关系非常多,直接把它们写在同一个文件中,阅读和维护都是很痛苦的。因此,Dagger2提出了Scope、Subcomponent的概念,用以更好的管理和组织Component间的依赖关系。这篇文章将会对这三者做进一步的介绍。

Scope(作用域)

Scope是Dagger2中用来管理组件生命周期的概念。每个组件都可以指定一个Scope,用来控制组件的生存周期。

Scope 生命周期
@Singleton 整个应用的生命周期
@ActivityScope Activity的生命周期
@FragmentScope Fragment的生命周期
自定义Scope 自定义的生命周期

如何定义一个Scope

自定义Scope需要通过@Scope注解来实现。例如:

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface MyScope {}

然后可以在组件中使用@MyScope注解来指定组件的Scope:

@Component(modules = MyModule.class)
@MyScope
public interface MyComponent {}

Scope是如何工作的

Dagger2通过一个叫作ComponentFactory的类来管理组件的生命周期。ComponentFactory会在组件第一次被创建的时候被创建,然后在组件的生命周期内一直存在。当组件需要被销毁的时候,ComponentFactory就会被销毁。

当一个组件被创建的时候,Dagger2会创建一个新的ComponentFactory。当组件被销毁的时候,ComponentFactory就会被销毁。这样,Dagger2就可以保证组件只会在其指定的Scope内存在。

Component(组件)

Component是Dagger2中用来管理依赖关系的概念。组件由一个或多个模块组成,模块提供组件所需的依赖对象。

组件可以通过@Component注解来定义。例如:

@Component(modules = MyModule.class)
public interface MyComponent {
  void inject(MyClass myClass);
}

组件可以通过以下方式被创建:

  • 手动创建
  • 使用Dagger2的依赖注入框架自动创建

手动创建组件

组件可以通过以下代码手动创建:

MyComponent component = DaggerMyComponent.create();

使用Dagger2的依赖注入框架自动创建组件

Dagger2的依赖注入框架可以自动创建组件。要使用依赖注入框架自动创建组件,需要在应用程序的Application类中添加以下代码:

public class MyApplication extends Application {

  private MyComponent component;

  @Override
  public void onCreate() {
    super.onCreate();

    component = DaggerMyComponent.builder().build();
  }

  public MyComponent getComponent() {
    return component;
  }
}

然后,可以在应用程序的其他地方通过以下代码获取组件:

MyComponent component = ((MyApplication) getApplication()).getComponent();

Subcomponent(子组件)

Subcomponent是Dagger2中用来管理组件之间依赖关系的概念。Subcomponent是组件的子类,它继承了组件的依赖关系。

Subcomponent可以通过@Subcomponent注解来定义。例如:

@Subcomponent
public interface MySubcomponent {
  void inject(MyClass myClass);
}

Subcomponent可以通过以下方式被创建:

  • 手动创建
  • 使用Dagger2的依赖注入框架自动创建

手动创建Subcomponent

Subcomponent可以通过以下代码手动创建:

MySubcomponent subcomponent = DaggerMySubcomponent.create(myComponent);

使用Dagger2的依赖注入框架自动创建Subcomponent

Dagger2的依赖注入框架可以自动创建Subcomponent。要使用依赖注入框架自动创建Subcomponent,需要在组件的@Component注解中添加subcomponents属性。例如:

@Component(modules = MyModule.class, subcomponents = MySubcomponent.class)
public interface MyComponent {
  void inject(MyClass myClass);
}

然后,可以在组件中通过以下代码获取Subcomponent:

MySubcomponent subcomponent = component.mySubcomponent();

总结

本篇文章中,我们介绍了Dagger2中的Scope、Component和Subcomponent的概念。Scope用来管理组件的生命周期,Component用来管理依赖关系,Subcomponent用来管理组件之间