📅  最后修改于: 2023-12-03 15:13:21.210000             🧑  作者: Mango
Dagger 是一个基于注解的依赖注入框架,可以提高 Android 应用程序的可测试性和可维护性。在 Dagger 中,有三种不同类型的组件,每种组件都有不同的生命周期和作用。
Dagger 中的三种组件类型如下:
@Component
组件@Subcomponent
子组件@Module
模块@Component
组件@Component
组件是依赖注入系统的根节点,它定义了依赖关系的作用域和生命周期。一个应用程序通常只有一个 @Component
组件,它通常包含一个或多个 @Module
模块。
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MyApplication application);
ApiService getApiService();
}
上述代码中,@Component
组件使用 modules
属性提供一个或多个模块,并使用 inject()
方法注入依赖项。此外,使用 getApiService()
方法获取接口实例。
@Subcomponent
子组件@Subcomponent
子组件是 @Component
组件的子集,它可以创建具有相同作用域的依赖项。一个应用程序可以有多个 @Subcomponent
子组件,每个子组件对应一个特定的功能。
@Subcomponent(modules = {LoginModule.class})
public interface LoginComponent {
void inject(LoginActivity activity);
LoginPresenter getLoginPresenter();
}
上述代码中,@Subcomponent
子组件使用 modules
属性提供一个或多个模块,并使用 inject()
方法注入依赖项。此外,使用 getLoginPresenter()
方法获取 Presenter 实例。
@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 应用程序的可测试性和可维护性。