简单谈谈Hilt——依赖注入框架
今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了。所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架——Hilt,今天一起来看看:
- 依赖注入是啥?为什么需要她?
- Hilt是啥,怎么用?
- Hilt支持哪些类的依赖注入。
依赖注入是啥?为什么需要她?
简单的说,依赖注入就是内部的类在外部实例化了。也就是不需要自己去做实例化工作了,而是交给外部容器来完成,最后注入到调用者这边,形成依赖注入。
举个例子:
Activity中有一个user类,正常情况下要使用这个user肯定是需要实例化它,不然他是个空值,但是用了依赖注入后,就不需要在Activity内部再去实例化,就可以直接使用它了。
@AndroidEntryPoint
class MainActivity : BaseActivity() {
@Inject
lateinit var user: User
}
这个user就可以直接使用了,是不是有点神奇,都不需要手动依赖了,当然代码没写完,后面再去完善。只是表达了这么一个意思,也就是依赖注入的含义。
那么这种由外部容器来实例化对象的方式到底有什么好处呢?最大的好处就是减少了手动依赖,对类进行了解耦。具体主要有以下几点:
- 依赖注入库会自动释放不再使用的对象,减少资源的过度使用。
- 在配置
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")
}
说下几个注释的含义:
@HiltAndroidApp。所有使用Hilt的App必须包含一个使用 @HiltAndroidApp 注解的 Application,相当于Hilt的初始化,会触发Hilt代码的生成。@AndroidEntryPoint。用于提供类的依赖,也就是代表这个类会用到注入的实例。@Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法中。
Hilt支持哪些类的依赖注入。
1) 如果是 Hilt 支持的 Android 组件,直接使用 @AndroidEntryPoint注解即可。比如Activity,Fragment,Service等等。
- 如果是
ComponentActivity的子类Activity,那么直接使用@AndroidEntryPoint就可以了,比如上面的例子。 - 如果是其他的Android类,必须在它依赖的Android类添加同样的注解,例如在 Fragment 中添加
@AndroidEntryPoint注解,必须在Fragment依赖的Activity上也添加@AndroidEntryPoint注解。
2)如果是需要注入第三方的依赖,可以使用@Module注解,使用 @Module注解的普通类,在其中创建第三方依赖的对象。比如获取okhttp的实例
@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()
参考
https://juejin.im/post/6844904198803292173
拜拜
有一起学习的小伙伴可以关注下️我的公众号——码上积木,每天剖析一个知识点,我们一起积累知识。
简单谈谈Hilt——依赖注入框架的更多相关文章
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
- Ninject是一款.Net平台下的开源依赖注入框架
Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替Xml文件完成类型绑定.Ninject结构精巧,功能 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成
Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法.对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨 ...
- .net core程序中使用微软的依赖注入框架
我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...
- Spring.NET依赖注入框架学习--简单对象注入
Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
- 史上最好用的依赖注入框架Google Guice【转】
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC).Guice非常小而且快. (其他的依赖注入框架还有Dagger,Spring) Spring ...
- 放弃dagger?Anrdoi依赖注入框架koin
Koin 是什么 Koin 是为 Kotlin 开发者提供的一个实用型轻量级依赖注入框架,采用纯 Kotlin 语言编写而成,仅使用功能解析,无代理.无代码生成.无反射. 官网地址 优势 依赖注入好处 ...
- ASP.NET Core 6框架揭秘实例演示[06]:依赖注入框架设计细节
由于依赖注入具有举足轻重的作用,所以<ASP.NET Core 6框架揭秘>的绝大部分章节都会涉及这一主题.本书第3章对.NET原生的依赖注入框架的设计和实现进行了系统的介绍,其中设计一些 ...
随机推荐
- BeautifulSoup使用手册(查询篇)
目录 开始使用呢 解析器 四种对象 tag对象 标签名(name) 属性值(Attributes) 多值属性 内容 Comment对象 prettify()方法 find_all方法 contents ...
- Book of Shaders 01 - 关于函数造型能力的理解
0x00 从函数出发 Shader 中的很多效果都是由函数计算得出的,如何更好地理解二者的关系呢.不妨先看看函数是什么?函数的定义可以简单地描述为:给定一个集合 A,对于其中的元素施加法则 f,则可以 ...
- 【代码审计】JAVA代码审计
分享一些Java安全相关文章,其中大部分都涉及到代码的分析与审计. 大家总是在找Java的代码审计的文章,但好像很多人选择性失明. 其实Java没有和PHP一样的简单,所以你觉得你看到的文章不是入门级 ...
- C\C++中strcat()函数
转载:https://blog.csdn.net/smf0504/article/details/52055971 C\C++中strcat()函数 ...
- 【题解】CF413C Jeopardy!
\(\color{blue}{Link}\) \(\text{Solution:}\) 首先,显然的策略是把一定不能翻倍的先加进来.继续考虑下一步操作. 考虑\(x,y\)两个可以翻倍的物品,且\(a ...
- 浅谈Exgcd(扩展欧几里得)
我们已知,求最大公约数的方法: 求A,B两数的最大公约数,递归求解,递归边界是B==0. gcd(a,b)=gcd(b,a%b) 我们进一步来求Ax+By=Gcd(A,B)的解. 尝试套用欧几里得求法 ...
- STM32之旅3——时钟数
STM32之旅3--时钟数 STM32F1是M3内核,它的时钟数很庞大,让一个初学者去看,估计会很吃力,和我们入门的8051单片机的时钟不同,这里又倍频.又分频,而且还分成好多个时钟,不同的外设时钟不 ...
- 2014年 实验五 Internet与网络工具的使用
实验五 Internet与网络工具的使用 [实验目的] ⑴.FTP服务器的架设和客户端的使用. ⑵.使用云盘和云笔记应用 ⑶.运用QQ的远程协助功能. (4).默认安装foxmail软件,进行邮件 ...
- 不是计算机专业的,可以转专业甚至转行学IT吗?答案揭晓~
相信有这样疑惑的同学不在少数,随着互联网的快速发展,越来越多的人想要转行到IT行业,可又担心自己的专业不对口,影响将来的发展,那么究竟不是计算机专业的可以转行IT吗? 当然是可以的,其实很多的IT大佬 ...
- go正则贴吧
package main import ( "fmt" "io/ioutil" "net/http" "regexp" ...