📜  Android – Dagger 中的组件(1)

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

Android - Dagger 中的组件

Dagger 是一个基于注解的依赖注入框架,可以提高 Android 应用程序的可测试性和可维护性。在 Dagger 中,有三种不同类型的组件,每种组件都有不同的生命周期和作用。

组件类型

Dagger 中的三种组件类型如下:

  1. @Component 组件
  2. @Subcomponent 子组件
  3. @Module 模块
1. @Component 组件

@Component 组件是依赖注入系统的根节点,它定义了依赖关系的作用域和生命周期。一个应用程序通常只有一个 @Component 组件,它通常包含一个或多个 @Module 模块。

@Component(modules = {AppModule.class})
public interface AppComponent {
    void inject(MyApplication application);
    ApiService getApiService();
}

上述代码中,@Component 组件使用 modules 属性提供一个或多个模块,并使用 inject() 方法注入依赖项。此外,使用 getApiService() 方法获取接口实例。

2. @Subcomponent 子组件

@Subcomponent 子组件是 @Component 组件的子集,它可以创建具有相同作用域的依赖项。一个应用程序可以有多个 @Subcomponent 子组件,每个子组件对应一个特定的功能。

@Subcomponent(modules = {LoginModule.class})
public interface LoginComponent {
    void inject(LoginActivity activity);
    LoginPresenter getLoginPresenter();
}

上述代码中,@Subcomponent 子组件使用 modules 属性提供一个或多个模块,并使用 inject() 方法注入依赖项。此外,使用 getLoginPresenter() 方法获取 Presenter 实例。

3. @Module 模块

@Module 模块提供依赖项的创建方式,用于告诉 Dagger 如何创建依赖项。一个应用程序可以有多个 @Module 模块,每个模块对应一个依赖项的集合。

@Module
public class AppModule {
    private Context context;

    public AppModule(Context context) {
        this.context = context;
    }

    @Provides
    @Singleton
    ApiService provideApiService() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ApiService.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit.create(ApiService.class);
    }
}

上述代码中,@Module 模块使用 @Provides 注解表示提供一个依赖项,并使用 @Singleton 注解表示该依赖项是单例的。同时,该模块还提供了一个应用程序上下文的实例。

使用组件

使用 Dagger 的前提是需要先创建组件实例,然后使用该实例注入依赖项。在 Android 应用程序的情况下,通常需要在应用程序的 onCreate() 方法中创建主 @Component 组件的实例。

public class MyApplication extends Application {
    private static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }

    public static AppComponent getAppComponent() {
        return appComponent;
    }
}

上述代码中,MyApplication 类创建了一个静态的 AppComponent 实例,并使用 DaggerAppComponent 构建器创建该实例。

在需要注入依赖项的地方,可以使用 @Inject 注解来标记需要注入依赖项的变量。

public class LoginActivity extends AppCompatActivity {
    @Inject
    LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        MyApplication.getAppComponent().loginComponentBuilder()
                .loginModule(new LoginModule(this))
                .build()
                .inject(this);
    }
}

上述代码中,LoginActivity 类使用 @Inject 注解标记 LoginPresenter 变量,以便 Dagger 可以自动注入该变量。同时,在 onCreate() 方法中,该类通过 MyApplication 类的 getAppComponent() 方法获取 AppComponent 实例,并通过 loginComponentBuilder() 方法获取 LoginComponent 实例,从而可以注入依赖项。

总结

Dagger 中的组件类型分别是 @Component 组件,@Subcomponent 子组件和 @Module 模块。通过使用这些组件,可以提高 Android 应用程序的可测试性和可维护性。