Android Hilt依赖注入框架
Posted Just_Paranoid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Hilt依赖注入框架相关的知识,希望对你有一定的参考价值。
Hilt 是一个基于 Dagger2 的依赖注入框架,它提供了一些简便的注入方式来简化开发者在 android 应用中使用 Dagger2 的复杂性。Hilt 旨在简化 Android 应用程序中的依赖注入实现,使开发人员能够更轻松地管理依赖项和应用程序的组件。
Hilt 的主要目标是提供一种简单的方式来管理应用程序的依赖项,同时避免手动管理依赖项的复杂性。Hilt 使用注解来标记依赖项,这使得代码更易于阅读和维护。Hilt 还提供了一些额外的功能,如支持 ViewModel 和 AndroidX 组件,这些功能可以帮助开发人员更轻松地管理应用程序的组件和生命周期。
Hilt 的核心是 Dagger2,Dagger2 是一个强大的依赖注入框架,它使用代码生成来提供快速的依赖注入。Hilt 的目标是简化 Dagger2 的使用,同时提供一些额外的功能,使开发人员能够更轻松地管理依赖项和应用程序的组件。
Hilt 可以在 Android 应用程序的不同层次中使用,如应用程序级别、Activity 级别和 Fragment 级别。它提供了一些注入方式来注入依赖项,如构造函数注入、字段注入和方法注入。使用 Hilt 可以更轻松地管理依赖项,同时避免了手动管理依赖项的复杂性。
使用场景
Hilt 的使用场景是 Android 应用程序中的依赖注入(DI)和依赖管理。Hilt 旨在简化 Android 应用程序中的 DI 实现,使开发人员能够更轻松地管理依赖项和应用程序的组件。以下是一些 Hilt 的使用场景:
- 管理 Activity 和 Fragment 中的依赖项
在 Android 应用程序中,Activity 和 Fragment 是应用程序的核心组件。在这些组件中,有时需要访问一些共享的依赖项,如 Retrofit、ViewModel 等。使用 Hilt 可以更轻松地管理这些依赖项,同时避免了手动管理依赖项的复杂性。
- 管理单例依赖项
在 Android 应用程序中,有一些依赖项是单例的,如数据库、网络客户端等。使用 Hilt 可以更轻松地管理这些单例依赖项,同时避免了手动管理单例依赖项的复杂性。
- 管理多个实现的依赖项
在 Android 应用程序中,有时需要为同一个接口或抽象类提供多个实现。使用 Hilt 可以更轻松地管理这些多个实现的依赖项,同时避免了手动管理这些依赖项的复杂性。
- 管理测试依赖项
在 Android 应用程序中,测试依赖项是非常重要的,因为它们可以帮助开发人员编写更健壮的测试用例。使用 Hilt 可以更轻松地管理测试依赖项,同时避免了手动管理测试依赖项的复杂性。
- 管理应用程序组件的生命周期
在 Android 应用程序中,应用程序组件的生命周期是非常重要的。使用 Hilt 可以更轻松地管理应用程序组件的生命周期,同时避免了手动管理应用程序组件的复杂性。
以上是 Hilt 的使用场景。Hilt 旨在简化 Android 应用程序中的 DI 实现,使开发人员能够更轻松地管理依赖项和应用程序的组件。
相关注解
Hilt 提供了一些注解来简化 Android 应用程序中的依赖注入实现。以下是 Hilt 中常用的注解及其含义:
- @HiltAndroidApp
用于标记应用程序的 Application 类,以便在应用程序启动时自动生成依赖注入代码。
- @AndroidEntryPoint
用于标记应用程序中的组件(Activity、Fragment、Service、BroadcastReceiver 等),以便在这些组件中自动注入依赖项。
- @Inject
用于标记要注入的依赖项的构造函数、字段或方法。
- @Module
用于标记提供依赖项的模块类,通过在模块类中提供 @Provides 方法来提供依赖项。
- @Provides
用于标记模块类中提供依赖项的方法。
- @Singleton
用于标记依赖项为单例模式,使得每次注入该依赖项时都返回同一个实例。
- @ViewModelInject
用于标记 ViewModel 的构造函数,以便在 ViewModel 中注入依赖项。
- @Assisted
用于标记 ViewModel 的构造函数参数,以便在使用 assisted injection 时注入这些参数。
- @AssistedInject
用于标记使用 assisted injection 创建的 ViewModel 的构造函数。
以上是 Hilt 中常用的注解及其含义。使用这些注解可以更轻松地管理依赖项和应用程序的组件。
使用详解
Hilt 是一个用于在 Android 应用程序中实现依赖注入(DI)的库,它是由 Google 推出的一个开源项目,旨在简化 Android 应用程序中的 DI 实现。以下是 Hilt 的使用详解:
- 添加 Hilt 依赖
首先,需要在应用程序的 build.gradle 文件中添加 Hilt 的依赖项:
dependencies
// 添加 Hilt 的核心库
implementation 'com.google.dagger:hilt-android:2.40.5'
// 添加 Hilt 的编译器插件
kapt 'com.google.dagger:hilt-android-compiler:2.40.5'
- 配置应用程序
在应用程序的 Application 类中,需要添加 @HiltAndroidApp
注解,以表示该应用程序使用了 Hilt:
@HiltAndroidApp
public class MyApp extends Application
// ...
- 定义依赖项
在应用程序中,需要定义一些依赖项,以便后续在应用程序中使用。可以使用 @Singleton
注解来标记一个单例依赖项,也可以使用 @Provides
注解来提供一个依赖项的实现:
@Module
@InstallIn(ApplicationComponent.class)
public class AppModule
@Singleton
@Provides
public SomeDependency provideSomeDependency()
return new SomeDependency();
在上述代码中,@Module
注解表示这是一个依赖项模块,@InstallIn
注解表示这个模块将在 ApplicationComponent 生命周期中安装。@Singleton
注解表示 SomeDependency
是一个单例依赖项,@Provides
注解表示提供 SomeDependency
的实现。
- 注入依赖项
在需要使用依赖项的类中,可以使用 @Inject
注解来注入依赖项:
public class MyActivity extends AppCompatActivity
@Inject
SomeDependency someDependency;
// ...
在上述代码中,@Inject
注解表示注入 SomeDependency
依赖项。在使用该类之前,需要在其构造函数中添加 @Inject
注解,以便 Hilt 可以自动将依赖项注入该类:
public class MyActivity extends AppCompatActivity
@Inject
SomeDependency someDependency;
@Inject
public MyActivity()
// ...
// ...
在上述代码中,@Inject
注解表示注入 MyActivity
类本身。
- 在 Fragment 中使用 Hilt
如果要在 Fragment 中使用 Hilt,需要将 @AndroidEntryPoint
注解添加到该 Fragment 中:
@AndroidEntryPoint
public class MyFragment extends Fragment
@Inject
SomeDependency someDependency;
// ...
在上述代码中,@AndroidEntryPoint
注解表示该 Fragment 使用了 Hilt。
以上是 Hilt 的使用详解。Hilt 简化了 Android 应用程序中的依赖注入实现,使开发人员能够更轻松地管理依赖项和应用程序的组件。
https://developer.android.google.cn/training/dependency-injection/hilt-android
#yyds干货盘点# JetPack | Hilt-依赖注入框架上手指南
Hilt 是Google 最新的依赖注入框架,其是基于Dagger研发,但它不同于Dagger。对于Android开发者来说,Hilt可以说专门为Android 打造,提供了一种将Dagger依赖项注入到Android应用程序的标准方法,而且创建了一组标准的组件和作用域,这些组件会自动集成到Android应用程序的各个生命周期中,以简化开发者的上手难度。
相应的一些注解如下:
-
@HiltAndroidApp
触发Hilt的代码生成,包括适用于应用程序的基类,可以使用依赖注入,应用程序容器是应用程序的父容器,这意味着其他容器可以访问其提供的依赖项。
-
@AndroidEntryPoint
其会创建一个依赖容器,该容器遵循Android类的生命周期
-
@Inject
用来注入的字段,其类型不能为Private
如果要告诉 Hilt 如何提供相应类型的实例,需要将 @Inject 添加到要注入的类的构造函数中。
Hilt有关如何提供不同类型的实例的信息也称为绑定。
-
@Install(xx)
Install 用来告诉 Hilt 这个模块会被安装到哪个组件上.
组件(Compenent)
Compenent | Injector for |
---|---|
ApplicationComponent |
Application |
ActivityRetainedComponent |
ViewModel (请参阅JetPack-ViewModel扩展) |
ActivityComponent |
Activity |
FragmentComponent |
Fragment |
ViewComponent |
View |
ViewWithFragmentComponent |
View 与 @WithFragmentBindings |
ServiceComponent |
Service |
需要注意的是,Hilt仅支持扩展FragmentActivity
(如AppCompatActivity
)的活动和扩展Jetpack库的片段Fragment
,而不支持Fragment
Android平台(现已弃用)的 片段 。
组件(Compenent)的生命周期
- 它限制了在创建组件和生成组件范围绑定的生命周期
- 它指示合适可以使用成员注入的值。(例如:当@Inject 字段不为null时)
Component | 作用范围 | Created at | Destroyed at |
---|---|---|---|
ApplicationComponent |
@Singleton |
Application#onCreate() |
Application#onDestroy() |
ActivityRetainedComponent |
@ActivityRetainedScope |
Activity#onCreate() 1 |
Activity#onDestroy() 1 |
ActivityComponent |
@ActivityScoped |
Activity#onCreate() |
Activity#onDestroy() |
FragmentComponent |
@FragmentScoped |
Fragment#onAttach() |
Fragment#onDestroy() |
ViewComponent |
@ViewScoped |
View#super() |
View destroyed |
ViewWithFragmentComponent |
@ViewScoped |
View#super() |
View destroyed |
ServiceComponent |
@ServiceScoped |
Service#onCreate() |
Service#onDestroy() |
例如:
@Singletion
class TestCompenent @Inject constructor()
如何使用?
先导入依赖
implementation com.google.dagger:hilt-android:2.28-alpha
kapt com.google.dagger:hilt-android-compiler:2.28-alpha
classpath com.google.dagger:hilt-android-gradle-plugin:2.28-alpha
相应的model下增加
apply plugin: dagger.hilt.android.plugin
举个
以上是关于Android Hilt依赖注入框架的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点# JetPack | Hilt-依赖注入框架上手指南
Hilt 稳定版发布 | 更便捷的 Android 依赖项注入