目录

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、依赖

根据需求方和提供方的作用关系分为类依赖(直接依赖或强依赖)、方法依赖(间接依赖)、成员依赖(待定类型依赖)

android hidl挂掉 android hilt_android

                                     

android hidl挂掉 android hilt_依赖注入_02


              图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注解介绍

android hidl挂掉 android hilt_依赖注入_03


图3.Hilt & Dragger Annotations

2.3、Hilt注解特别说明

  • @Qualifier用途
    当类型定义了多个绑定时,使用它来标识改类型的特定绑定,分为预定义限定符和自定义限定符。
    预定义限定符:Hilt 提供了一些预定义限定符,例如你可能在不同的情况下需要不同的 ContextApplictionActivity)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