目录
1、基本说明
1.1、依赖
1.2、依赖注入(DI)
1.3、依赖注入方式
1.4、依赖注入优势
2、使用Hilt实现依赖注入
2.1、添加依赖项
2.2、Hilt & Dagger注解介绍
2.3、Hilt注解特别说明
2.4、Hilt官方示例
1、基本说明
1.1、依赖
根据需求方和提供方的作用关系分为类依赖(直接依赖或强依赖)、方法依赖(间接依赖)、成员依赖(待定类型依赖)
图1.直接依赖 图2.间接依赖
1.2、依赖注入(DI)
将依赖关系传递给其他对象或框架,依赖注入方式分别是构造函数注入(constructor injection)、字段注入(setter injection)、接口注入(interface injection),在Android中前两种比较常用。
// Constructor
Client(Service service) {
// Save the reference to the passed-in service inside this client
this.service = service;
}
// Setter method
public void setService(Service service) {
// Save the reference to the passed-in service inside this client.
this.service = service;
}
// Service setter interface.
public interface ServiceSetter {
public void setService(Service service);
}
// Client class
public class Client implements ServiceSetter {
// Internal reference to the service used by this client.
private Service service;
// Set the service that this client is to use.
@Override
public void setService(Service service) {
this.service = service;
}
}
1.3、依赖注入方式
- 人工依赖注入:人工编写大量样板代码
- 自动依赖注入:通过库自动执行创建和提供依赖,它们归来两类分别是基于反射解决方案(运行时处理)和静态解决方案(编译时处理)
1.4、依赖注入优势
- 重用类以及分离依赖项:更容易替换依赖项的实现。由于控制反转,代码重用得以改进,并且类不再控制其依赖项的创建方式,而是支持任何配置。
- 易于重构:依赖项成为API Surface的可验证部分,因此可以在创建对象时或编译时进行检查,而不是作为实现详情隐藏。
- 易于测试:类不管理其依赖项,因此在测试时,可以传入不同的实现以测试所有不同用例。
2、使用Hilt实现依赖注入
Hilt在依赖库Dagger的基础上构建而成,是Android中实现依赖注入的Jetpack库。
2.1、添加依赖项
首先,将hilt-android-gradle-plugin插件添加到项目的根级build.gradle文件中:
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.30.1-alpha'
}
}
然后,应用Gradle插件在app/build.gradle文件中添加以下依赖项:
...
apply plugin: 'dagger.hilt.android.plugin'
android {
...
//如果需要使用Java8特性则添加
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.google.dagger:hilt-android:2.30.1-alpha'
annotationProcessor 'com.google.dagger:hilt-android-compiler:2.30.1-alpha'
}
注意:同时使用 Hilt 和数据绑定的项目需要 Android Studio 4.0 或更高版本。
2.2、Hilt & Dagger注解介绍
图3.Hilt & Dragger Annotations
2.3、Hilt注解特别说明
- @Qualifier用途
当类型定义了多个绑定时,使用它来标识改类型的特定绑定,分为预定义限定符和自定义限定符。
预定义限定符:Hilt 提供了一些预定义限定符,例如你可能在不同的情况下需要不同的Context
(Appliction
、Activity
)Hilt 提供了@ApplicationContext
和@ActivityContext
两种限定符。
自定义限定符:
@Qualifier
annotation class InMemoryLogger
@Qualifier
annotation class DatabaseLogger
@InstallIn(SingletonComponent::class)
@Module
abstract class LoggingDatabaseModule {
@DatabaseLogger
@Singleton
@Binds
abstract fun bindDatabaseLogger(impl:LoggerLocalDataSource):LoggerDataSource
}
@InstallIn(SingletonComponent::class)
@Module
abstract class LoggingInMemoryModule{
@InMemoryLogger
@Singleton
@Binds
abstract fun bindInMemeryLogger(impl: LoggerInMemoryDataSource):LoggerDataSource
}
2.4、Hilt官方示例
git clone -b solution https://github.com/googlecodelabs/android-hilt