什么是依賴注入吨艇?---朱凱
這些都屬于由外部來提供依賴的初始化与斤,所以都是依賴注入
Hilt 好不好用网持,我們先來看看它是個什么画切。它是個用注解來進行配置的依賴注入庫竣稽。注解是它的寫法,首先它是個依賴注入庫霍弹,對吧毫别?什么是依賴注入?一個類里有兩個變量典格,這兩個變量就是它的依賴:
總結(jié):通過外部進行賦值
依賴注入的好處:數(shù)據(jù)共享
比如:activity岛宦。Prsenter,module里面都要用同一個user耍缴,可以通過hilt實現(xiàn)數(shù)據(jù)共享砾肺。
hilt和dragger2的區(qū)別
hilt:使用簡單,然后是場景化私恬,不是封裝
dragger2:使用復雜
一個注解就能讓 Activity 內(nèi)部的依賴自動被注入债沮,而 Dagger 需要手動注入,就是調(diào)用inject方法!
ButterKnife 或者現(xiàn)在 Jetpack 推出的 ViewBinding 它們提供的功能本鸣,Hilt 提供了嗎疫衩?
不好意思,Hilt 不提供它們的功能荣德。Hilt 和 Dagger 雖然用法和 ButterKnife 很像闷煤,都是給變量加注解,然后變量會自動賦值涮瞻,但它們的功能定位是不一樣的:Hilt 和 Dagger 是做依賴注入的鲤拿,而 ButterKnife 和 ViewBinding 是做視圖綁定的。
Hilt是對Dagger2的封裝署咽。就像retrofit是對okhttp的封裝一樣近顷。
那么 Hilt 是什么呢?Hilt 是一個內(nèi)部使用 Dagger 的庫宁否,只是簡化了它的用法窒升,因此我在這里所說的有關(guān) Dagger 的內(nèi)容也適用于 Hilt
相比于Dagger2,Hilt最明顯的特征就是:1. 簡單慕匠。2. 提供了Android專屬的API饱须。
Hilt原理:
1.dagger里面的apt
2.自動注入,通過字節(jié)碼插樁 javaassist台谊,在oncrate之前蓉媳,用另外一個activity譬挚!
Hilt 做的優(yōu)化包括
無需編寫大量的Component代碼
Scope也會與Component自動綁定
預定義綁定,例如 Application與Activity
預定義的限定符酪呻,例如@ApplicationContext與@ActivityContext
————————————————
應用實戰(zhàn):網(wǎng)絡(luò)請求的多個框架减宣,封裝成了代理模式,然后可以改成依賴注入M孳r揭浮!姨蟋!
里面有application,activity,Fragment的注解
Hilt 應用類
所有使用 Hilt 的應用都必須包含一個帶有 @HiltAndroidApp 注釋的 Application 類屉凯。
@HiltAndroidApp
class MyApplication:Application() {
}
生成的這一 Hilt 組件會附加到 Application 對象的生命周期,并為其提供依賴項眼溶。此外悠砚,它也是應用的父組件,這意味著堂飞,其他組件可以訪問它提供的依賴項灌旧。我們查看生成的源碼可以看到一個Hilt_MyApplication類,這是此注解生成類之一绰筛,它是hilt組建全局的管理者
將依賴項注入 Android 類=============(是入口嗎)
在 Application 類中設(shè)置了 Hilt 且有了應用級組件后枢泰,Hilt 可以為帶有 @AndroidEntryPoint 注釋的其他 Android 類提供依賴項,現(xiàn)在我們先在我們熟悉的MainActivity添加這個注釋,看看會發(fā)生什么:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
可以使用注入框架進行實例的創(chuàng)建铝噩,不需要new
@Inject lateinit var user:User//定義一個User對線
實踐:
第一步:添加依賴
根目錄:
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
主目錄:
apply plugin: 'dagger.hilt.android.plugin'
implementation "com.google.dagger:hilt-android:2.28-alpha"
annotationProcessor "com.google.dagger:hilt-android-compiler:2.28-alpha"
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 }</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">第二步:定義bean</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">
public class HttpObject {
}
</pre>
第三步:Module</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)
@Module public class HttpModule {
@Singleton
@Provides public HttpObject getHttpObject(){
return new HttpObject();
}
}
</pre>
同時把module安裝到component里面去</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)</pre>
<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">第四步:使用:注入點</pre>
注入到Activity
<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@AndroidEntryPoint public class MainActivity extends AppCompatActivity {
@Inject
HttpObject httpObject; @Inject
HttpObject httpObject2; @Inject
public TestInterface testInterface; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); }</pre>
第五步:application中定義</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@HiltAndroidApp public class MyApplication extends Application {
}
</pre> </pre>
Hilt 接口的使用
原理:最終通過module實現(xiàn):饴臁!?ビ埂C住!具被!
一個接口很多實現(xiàn)類玻募,接口具體實現(xiàn)。
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public interface TestInterface {
void method(); }
</pre>
2一姿、提供一個實現(xiàn)接口的對象
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public class TestClass implements TestInterface {
@Inject
TestClass() {
}
@Override
public void method() {
Log.i("TestClass", "TestClass注入成功七咧!");
}
}
</pre>
3、編寫對應Module
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Module @InstallIn(ActivityComponent.class)
public abstract class TestInterfaceModule {
// @Binds // public abstract TestInterface bindTestClass(TestClassTwo testClass //實現(xiàn)不同的 功能); @Binds
public abstract TestInterface bindTestClass(TestClass testClass); }
</pre>
4叮叹、最終使用
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Inject public TestInterface testInterface; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); </pre>
hilt對項目的一個封裝(jetpack-hilt-flow-mvvm 超簡潔實戰(zhàn)項目)
http://www.reibang.com/u/cf8709c5d63a
recycleView
http://www.reibang.com/p/a1f21380a43d
http://www.reibang.com/p/fd4f090c882e---朱凱視頻
https://juejin.cn/post/6978407567047262222?share_token=d66a5860-52fe-4257-93d4-7bca921e8be3
https://juejin.cn/post/6902009428633698312?share_token=35134c40-3d98-47cf-95a0-1ec670f6bdca
demo: