📜  Android 中的 Dagger 2 @Inject 和 @Component 注解(1)

📅  最后修改于: 2023-12-03 15:13:21.281000             🧑  作者: Mango

Android 中的 Dagger 2 @Inject 和 @Component 注解

Dagger 2 是一个依赖注入框架,帮助 Android 开发者更容易地管理应用程序的依赖。@Inject 和 @Component 是 Dagger 2 中最常用的两个注解。在本文中,我们将了解它们的功能和使用。

@Inject 注解

@Inject 注解用于告诉 Dagger 2 要创建的对象,并且告诉 Dagger 2 该对象的依赖项。这使得我们可以使用依赖注入来实例化对象。

基本用法

例如,我们有一个类 Person,其依赖于另一个类 Pet,我们可以使用 @Inject 注解在 Pet 类的构造函数中:

public class Pet {
  @Inject
  public Pet() {}
}

现在我们可以在 Person 类中使用 @Inject 注解来告诉 Dagger 2 该怎样实例化 Pet 对象:

public class Person {
  private Pet pet;

  @Inject
  public Person(Pet pet) {
    this.pet = pet;
  }
}

在上述代码中,我们使用 @Inject 注解告诉 Dagger 2 构造函数需要 Pet 对象作为参数来创建一个 Person 对象。

依赖项

@Inject 注解还可以用于标记我们要注入的依赖项。例如,如果我们使用 Retrofit 发送网络请求,我们需要一个 OkHttpClient 对象,可以使用 @Inject 注解在 OkHttpClient 对象的构造函数中:

public class MyModule {
  @Provides
  @Singleton
  OkHttpClient provideOkHttpClient() {
    return new OkHttpClient();
  }
}

public class MyApplication extends Application {
  private OkHttpClient okHttpClient;

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

    okHttpClient = DaggerMyComponent.create().getOkHttpClient();
  }
}

public class MyService {
  private final OkHttpClient okHttpClient;

  @Inject
  public MyService(OkHttpClient okHttpClient) {
    this.okHttpClient = okHttpClient;
  }
}

在上述代码中,我们使用 @Inject 注解告诉 Dagger 2 MyService 类依赖于 OkHttpClient 对象。

@Component 注解

@Component 注解是 Dagger 2 的核心组件之一,用于指定要注入依赖项的类,并在运行时生成注入对象的代码。

基本用法

首先,我们需要在 Dagger 2 中创建一个组件接口,例如:

@Singleton
@Component(modules = {MyModule.class})
public interface MyComponent {
  MyService getMyService();
  OkHttpClient getOkHttpClient();
}

在上述代码中,我们使用 @Component 注解创建了一个名为 MyComponent 的组件,并标注为 @Singleton,表示该组件中的对象都应该是单例对象。同时,我们使用 modules 参数告诉 Dagger 2 需要使用哪些模块来提供依赖项。

在组件接口中,我们可以定义一些方法,这些方法返回需要注入依赖项的对象。

注入依赖项

接下来,我们可以在需要注入依赖项的地方使用 Dagger 2。例如,我们在 MyApplication 类中需要一个 OkHttpClient 实例,可以按照以下方式注入依赖项:

public class MyApplication extends Application {
  private OkHttpClient okHttpClient;

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

    MyComponent component = DaggerMyComponent.create();
    okHttpClient = component.getOkHttpClient();
  }
}

在上述代码中,我们使用 DaggerMyComponent 类(由 Dagger 2 生成)创建了一个 MyComponent 型对象 component,然后使用 component.getOkHttpClient() 方法获取 OkHttpClient 实例。

总结

在本文中,我们了解了 Dagger 2 中 @Inject 和 @Component 注解的基本用法。@Inject 注解用于告诉 Dagger 2 要创建的对象,并且告诉 Dagger 2 该对象的依赖项。@Component 注解是 Dagger 2 的核心组件之一,用于指定要注入依赖项的类,并在运行时生成注入对象的代码。