簡單談談Hilt——依賴注入框架
阿新 • • 發佈:2020-11-05
今天繼續Jetpack專題,相信不少的朋友都使用過Dagger,也放棄過Dagger,因為實在太難用了。所以官方也是為了讓我們更好使用依賴注入框架,為我們封裝了一個新的框架——Hilt,今天一起來看看:
* 依賴注入是啥?為什麼需要她?
* Hilt是啥,怎麼用?
* Hilt支援哪些類的依賴注入。
## 依賴注入是啥?為什麼需要她?
簡單的說,依賴注入就是內部的類在外部例項化了。也就是不需要自己去做例項化工作了,而是交給外部容器來完成,最後注入到呼叫者這邊,形成依賴注入。
舉個例子:
Activity中有一個user類,正常情況下要使用這個user肯定是需要例項化它,不然他是個空值,但是用了依賴注入後,就不需要在`Activity`內部再去例項化,就可以直接使用它了。
```kotlin
@AndroidEntryPoint
class MainActivity : BaseActivity() {
@Inject
lateinit var user: User
}
```
這個`user`就可以直接使用了,是不是有點神奇,都不需要手動依賴了,當然程式碼沒寫完,後面再去完善。只是表達了這麼一個意思,也就是`依賴注入`的含義。
那麼這種由外部容器來例項化物件的方式到底有什麼`好處`呢?最大的好處就是減少了手動依賴,對類進行了解耦。具體主要有以下幾點:
* 依賴注入庫會自動釋放不再使用的物件,減少資源的過度使用。
* 在配置 `scopes`範圍內,可重用依賴項和建立的例項,提高程式碼的可重用性,減少了很多模板程式碼。
* 程式碼變得更具可讀性。
* 易於構建物件。
* 編寫低耦合程式碼,更容易測試。
## Hilt是啥,怎麼用?
很明顯,Hilt就是一個依賴注入庫,一個封裝了`Dagger`,在`Dagger`的基礎上進行構建的一個依賴注入庫。`Dagger`我們都知道是一個早期的依賴注入庫,但確實不好用,需要配置很多東西,那麼Hilt簡單到哪了呢?我們繼續完善上面的例子:
```kotlin
@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的例項
```kotlin
@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。
```kotlin
class HiltViewModel @ViewModelInject constructor() : ViewModel() {}
private val mHitViewModule: HiltViewModel by viewModels()
```
## 參考
https://juejin.im/post/6844904198803292173
## 拜拜
> 有一起學習的小夥伴可以關注下❤️我的公眾號——碼上積木,每天剖析一個知識點,我們一起積累知識。
![](https://s1.ax1x.com/2020/11/05/BRV7Mq