android 依赖注入原理,简单谈谈Hilt——依赖注入框架

今天继续Jetpack专题,相信很多的朋友都使用过Dagger,也放弃过Dagger,由于实在太难用了。因此官方也是为了让咱们更好使用依赖注入框架,为咱们封装了一个新的框架——Hilt,今天一块儿来看看:框架

依赖注入是啥?为何须要她?

Hilt是啥,怎么用?

Hilt支持哪些类的依赖注入。

依赖注入是啥?为何须要她?

简单的说,依赖注入就是内部的类在外部实例化了。也就是不须要本身去作实例化工做了,而是交给外部容器来完成,最后注入到调用者这边,造成依赖注入。ide

举个例子:

Activity中有一个user类,正常状况下要使用这个user确定是须要实例化它,否则他是个空值,可是用了依赖注入后,就不须要在Activity内部再去实例化,就能够直接使用它了。函数

@AndroidEntryPoint

class MainActivity : BaseActivity() {

@Inject

lateinit var user: User

}

这个user就能够直接使用了,是否是有点神奇,都不须要手动依赖了,固然代码没写完,后面再去完善。只是表达了这么一个意思,也就是依赖注入的含义。post

那么这种由外部容器来实例化对象的方式到底有什么好处呢?最大的好处就是减小了手动依赖,对类进行了解耦。具体主要有如下几点:学习

依赖注入库会自动释放再也不使用的对象,减小资源的过分使用。

在配置 scopes范围内,可重用依赖项和建立的实例,提升代码的可重用性,减小了不少模板代码。

代码变得更具可读性。

易于构建对象。

编写低耦合代码,更容易测试。

Hilt是啥,怎么用?

很明显,Hilt就是一个依赖注入库,一个封装了Dagger,在Dagger的基础上进行构建的一个依赖注入库。Dagger咱们都知道是一个早期的依赖注入库,但确实很差用,须要配置不少东西,那么Hilt简单到哪了呢?咱们继续完善上面的例子:测试

@HiltAndroidApp

public class MainApplication extends Application {

}

@AndroidEntryPoint

class HiltActivitiy : AppCompatActivity() {

@Inject

lateinit var user: UserData

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

showToast(user.name)

}

}

data class UserData(var name: String) {

@Inject

constructor() : this("bob")

}

说下几个注释的含义:ui

@HiltAndroidApp。全部使用Hilt的App必须包含一个使用 @HiltAndroidApp 注解的 Application,至关于Hilt的初始化,会触发Hilt代码的生成。

@AndroidEntryPoint。用于提供类的依赖,也就是表明这个类会用到注入的实例。

@Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它经常使用于构造函数、非私有字段、方法中。

Hilt支持哪些类的依赖注入。

1) 若是是 Hilt 支持的 Android组件,直接使用 @AndroidEntryPoint注解便可。好比Activity,Fragment,Service等等。this

若是是ComponentActivity的子类Activity,那么直接使用@AndroidEntryPoint就能够了,好比上面的例子。

若是是其余的Android类,必须在它依赖的Android类添加一样的注解,例如在 Fragment 中添加@AndroidEntryPoint注解,必须在Fragment依赖的Activity上也添加@AndroidEntryPoint注解。

2)若是是须要注入第三方的依赖,可使用@Module注解,使用 @Module注解的普通类,在其中建立第三方依赖的对象。好比获取okhttp的实例code

@Module

@InstallIn(ApplicationComponent::class)

object NetworkModule {

/**

* @Provides

* @Singleton 提供单例

*/

@Provides

@Singleton

fun provideOkHttpClient(): OkHttpClient {

return OkHttpClient.Builder()

.build()

}

}

这里又有几个新的注解了:对象

@Module。用于建立依赖类的对象

@InstallIn。使用 @Module 注入的类,须要使用 @InstallIn 注解指定 module 的范围,例如使用 @InstallIn(ActivityComponent::class) 注解的 module 会绑定到 activity 的生命周期上。

@Provides。用于被 @Module注解标记类的内部的方法,并提供依赖项对象。

@Singleton。提供单例

3)为ViewModel提供的专门的注解

@ViewModelInject,在Viewmodel对象的构造函数中使用 @ViewModelInject 注解能够提供一个 ViewModel。

class HiltViewModel @ViewModelInject constructor() : ViewModel() {}

private val mHitViewModule: HiltViewModel by viewModels()

参考

拜拜

有一块儿学习的小伙伴能够关注下❤️个人公众号——码上积木,天天剖析一个知识点,咱们一块儿积累知识。

你可能感兴趣的:(android,依赖注入原理)