Android依赖注入-Hilt

目录

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

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

不使用依赖项注入的 Car 类                                     使用依赖项注入的 Car 类
              图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 提供了一些预定义限定符,例如你可能在不同的情况下需要不同的 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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值